Node.js杀死一个异步调用

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;

但是这对我来说似乎不是一个好的解决方案......


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

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

你超级密切

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)
};
链接地址: http://www.djcxy.com/p/52701.html

上一篇: Node.js killing an async call

下一篇: How does a node.js application keep running when no new events are queued up?