1

だから、私はNode.jsのハンズオンからティッカー、イベントエミッターの演習を試しています

私はこのコードを持っています:

var EventEmitter = require('events').EventEmitter,
    util = require('util');

// Ticker Constructor
var Ticker = function (interval) {
    this.interval = interval;
    this.pulse = null;
}

util.inherits(Ticker, EventEmitter);

Ticker.prototype.start = function() {
    this.emit('start');
    this.tick();
}

Ticker.prototype.stop = function() {
    if (this.pulse != null) clearTimeout(this.pulse);
    this.emit('stop');
}

Ticker.prototype.tick = function() {
    this.emit('tick');
    this.pulse = setTimeout(this.tick, this.interval);
}

var ticker = new Ticker(1000);
ticker.on('start', function() { console.log('Ticker: Start'); });
ticker.on('tick', function() { console.log('Ticker: Tick'); });
ticker.on('stop', function() { console.log('Ticker: Stop'); });

ticker.start();

実行すると、次のように出力されます。

ティッカー:開始ティッカー:ティック

timers.js:103
            if (!process.listeners('uncaughtException').length) throw e;
                                                                      ^
TypeError: Object #<Object> has no method 'emit'
    at Object.Ticker.tick [as _onTimeout] (/Users/twilson/Projects/tutorials/node/ticker-01.js:23:8)
    at Timer.list.ontimeout (timers.js:101:19)

ticker-01.js:23は関数this.emit('tick');のものです。Ticker.prototype.tick

助けてください、私は地球上で何がうまくいかないのか本当にわからないので、間違いなくスコーピングのことになるでしょう?:(

4

1 に答える 1

3

メソッドを呼び出すとsetTimeout(this.tick, this.interval)、その場で参照されてtickいるものではなく、デフォルトのコンテキスト内で実行されますthis。あなたはどちらかをする必要があります...

thisの値をティッカーインスタンスにバインドします。

setTimeout(this.tick.bind(this), this.interval)

または、ティッカーインスタンスへの参照を保存します。

var self = this;
setTimeout(function() {
    self.tick();
}, this.interval);
于 2012-08-03T20:54:03.040 に答える