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

时间:2015-09-25 14:48:18

标签: javascript node.js events asynchronous meteor

我正在尝试创建一个具有未来的功能。在此函数中,它将等待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();
}

我遇到了一些问题。

  • 当未来返回时,事件侦听器仍然绑定
  • 由于超时,未来可能会多次返回

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

1 个答案:

答案 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并删除事件侦听器。