Node.js杀死异步调用

时间:2015-07-06 15:48:53

标签: node.js asynchronous

Node.js中有没有办法杀死异步操作并阻止它完成(调用回调或解析promise)?

更具体地说,我们说我做了http.get()电话。这是一个异步操作,最终会调用传递的回调,或者触发错误事件。但这需要太长时间,我的代码中的逻辑可以说"嘿,我已经等了这么久,我不想再等了!"而是做一些其他事情。问题是,最终会调用回调,这可能会搞砸了!所以是的,有没有办法阻止回调被执行?我的想法是:

var notWaitingAnyMore = false;
http.get({}, function(res) {
    if(notWaitingAnyMore) { // do stuff! }
});
//do some other stuff
//now fed up with waiting:
notWaitingAnyMore = true;

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

2 个答案:

答案 0 :(得分:1)

你最好的选择可能是使用承诺。例如,如果您使用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

答案 1 :(得分:0)

你非常亲密

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)
};