Node.js终止异步调用

Node.js终止异步调用,node.js,asynchronous,Node.js,Asynchronous,Node.js中是否有任何方法可以终止异步操作并阻止其完成(调用回调或解析承诺) 更具体地说,假设我执行了一个http.get()调用。它是一个异步操作,最终将调用传递的回调,或触发错误事件。但是这需要很长时间,我的代码中的逻辑可能会说“嘿,我已经等了这么久,我不想再等了!”然后执行其他操作。问题是,回调最终会被调用,这可能会把事情搞砸!是的,有没有办法阻止回调被执行?我的想法是: var notWaitingAnyMore = false; http.get({}, function(res)

Node.js中是否有任何方法可以终止异步操作并阻止其完成(调用回调或解析承诺)

更具体地说,假设我执行了一个
http.get()
调用。它是一个异步操作,最终将调用传递的回调,或触发错误事件。但是这需要很长时间,我的代码中的逻辑可能会说“嘿,我已经等了这么久,我不想再等了!”然后执行其他操作。问题是,回调最终会被调用,这可能会把事情搞砸!是的,有没有办法阻止回调被执行?我的想法是:

var notWaitingAnyMore = false;
http.get({}, function(res) {
    if(notWaitingAnyMore) { // do stuff! }
});
//do some other stuff
//now fed up with waiting:
notWaitingAnyMore = true;
但这对我来说似乎不是一个好的解决方案…

你已经非常接近了

function outerMethod(input, callback){
  var notWaitingAnyMore = false;
  var maxTimeout = 1000*60; // 1min
  http.get({}, function(res) {
    if(!notWaitingAnyMore) {
      // do stuff!
      notWaitingAnyMore = true;
      callback(null, res);
    } else {
      return;
    }
  });
  setTimeout(function(){
    // We want to avoid calling back a second time if the http callback ran first:
    if(!notWaitingAnyMore) {
      notWaitingAnyMore = true;
      callback('timeout');
    } else {
      return
    }
  }, maxTimeout)
};

你最好的选择可能是使用承诺。例如,如果您使用的是
蓝鸟
,这个问题很容易解决:

new Promise(function(resolve, reject) {
  http.get({}, resolve);
}).timeout(500) // timeout length in ms
.then(function(res) {
  // do stuff!
}).catch(Promise.TimeoutError, function(err) {
  // do you need to do something after it times out?
})
//do some other stuff

利用承诺。然后,插入一个中间承诺,当notWaitingAnyMore变为true时,该承诺也会完成,并丢弃http结果。这就是您要寻找的吗?是否要设置一个中间承诺?值得注意的是,许多JavaScript Promise库都支持自动处理此问题的本机超时。不,http.get()就是一个例子,它可以是DB调用,也可以是任何异步操作。这只有在API提供机制的情况下才可能(如
clearTimeout
setTimeout
执行)。否则,您只需要让回调知道它可能不需要做任何事情,正如您在示例中所示。我认为承诺可能是实现这一点的惯用方法,正如其他人已经建议的那样。蓝鸟听起来不错,我会去看看,谢谢:)