Nodejs中的setInterval问题

时间:2013-03-07 17:50:10

标签: javascript node.js timer setinterval

我有这段代码,它给我发了以下错误:

            this.modifyAspect('health');
                 ^
TypeError: Object #<Timer> has no method 'modifyAspect'
    at Timer.tick (/Users/martinluz/Documents/Nodes/societ/node_modules/societal/societal.js:93:9)
    at Timer.exports.setInterval.timer.ontimeout (timers.js:234:14)

我尝试将modifyAspects()称为Societ.modifyAspectsthis.modifyAspects()modifyAspects(),但只会出错。任何帮助或建议都表示赞赏......

这是代码:

  var Societ = function(inboundConfig){

    this.population = undefined;
    this.owner_id =  undefined;
    this.owner_name = undefined;
    this.config = inboundConfig;
    this.aspects = {
        education:{
            facilities: undefined,
            rating: undefined
        },
        health: {
            facilities: undefined,
            rating: undefined
        }
    };

    this.modifiers = {
        health: 1,
        education: 2,
        population: 2
    };

    this.tickio = function(){
        console.log('tickio');
    }

    return{
        config: this.config,
        bootstrap: function(){
            this.owner_id = this.config.owner_id;
            setInterval(this.tick, 10000); /*** Problematic line ***/
        },
        yield: function(){

            console.log(this.population);   
        },
        getOwnerId: function(){
            return this.owner_id;
        },
        modifyAspect: function(aspect){
            console.log('Modifying aspect: '+aspect);
        },
        tick: function(){
            console.log('Ticking!');
            this.modifyAspect('health');
            console.log('Recalculate education');
            console.log('Recalculate population');
        },

    }
}

1 个答案:

答案 0 :(得分:6)

您需要将传递给setInterval的函数绑定到正确的上下文:

setInterval(this.tick.bind(this), 10000);

这将定义thisthis.tick实际指向的内容,如果你不绑定它,它将在定时器的上下文中运行(处理setInterval),就像你一样注意错误。