如何用超时和监听器创build未来

我正在试图创造一个有未来的function。 在这个函数中,它将等待一个EndError事件。 如果没有数据写入x秒,将返回一个错误。 这是我写的。

 Cylon.execute = function (subroutine, timeout=60000) { let future = new Future(); let done = future.resolver(); let timeoutId = Meteor.setTimeout(function () { done(new Meteor.Error('CylonTimeout')); }); this._messages.on('data', () => { timeoutId = Meteor.setTimeout(function () { done(new Meteor.Error('CylonTimeout')); }); }); this.on('End', () => { Meteor.clearTimeout(timeoutId); done(null, subroutine); }) this.on('Error', (err) => { Meteor.clearTimeout(timeoutId) done(err, null) }); this._commands.write(`Execute #${subroutine}\r`, 'utf8'); return future.wait(); } 

我遇到了一些问题。

  • 当未来的回报,事件监听者仍然受到约束
  • 未来可能由于超时而多次返回

这通常如何处理期货? 有没有办法清理这些事件?

首先,我build议你做this.once而不是this.on,所以你只会触发事件处理程序一次。 没有必要多次触发它。

另外我build议你这样做

 var self = this; done = function (err, result) { //remove all listeners self.removeListener('Error', handler); //.... and so on.... future.resolver()(err, result);//call actual done } 

这将防止被调用不止一次,并删除事件监听器。