我正在尝试创建一个具有未来的功能。在此函数中,它将等待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();
}
我遇到了一些问题。
通常如何处理期货?有没有办法清理这些事件?
答案 0 :(得分:2)
首先我建议你这样做。因为而不是this.on所以你只会触发一次事件处理程序。 没有必要多次触发它。
我建议你这样做
var self = this;
done = function (err, result) {
//remove all listeners
self.removeListener('Error', handler);
//.... and so on....
future.resolver()(err, result);//call actual done
}
这样可以防止多次调用done并删除事件侦听器。