Node.js类递归发射

Node.js class recursive emission

本文关键字:发射 递归 js Node      更新时间:2023-09-26

所以,我正在尝试Hands-On Node.js 中的Ticker,Event Emitter练习

我有这个代码:

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();

运行时输出以下内容:

Ticker:开始Ticker:Tick

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:23Ticker.prototype.tick函数的this.emit('tick');

帮助,因为我真的看不出到底出了什么问题,毫无疑问,这肯定是一件范围界定的事情?:(

调用setTimeout(this.tick, this.interval)时,tick方法将在默认上下文中执行,而不是this所指的上下文。你需要。。。

this的值绑定到ticker实例:

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

或者保存对ticker实例的引用:

var self = this;
setTimeout(function() {
    self.tick();
}, this.interval);