如何用超时和监听器创build未来
我正在试图创造一个有未来的function。 在这个函数中,它将等待一个End
或Error
事件。 如果没有数据写入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 }
这将防止被调用不止一次,并删除事件监听器。