Node.js类的recursion发射

所以,我正在尝试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(); 

运行时输出以下内容:

代码:开始代码: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:23this.emit('tick'); Ticker.prototype.tick函数。

帮助,因为我真的不明白到底是怎么回事,肯定是一个范围的东西无疑? 🙁

当调用setTimeout(this.tick, this.interval)tick方法将在默认上下文中执行,而不是在this引用的内容。 你需要…

将这个值绑定到ticker实例:

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

或者保存对股票实例的引用:

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