Node.js杀死一个asynchronous调用

有什么办法在Node.js杀死asynchronous操作,并阻止它完成(调用callback,或解决承诺)?

更具体的说,我做了一个http.get()调用。 这是一个asynchronous操作,最终会调用通过的callback,或者触发一个错误事件。 但是这个过程需要很长时间,我的代码中的逻辑可能会说:“嘿,我已经等了这么久了,我不想再等了!” 并做一些其他的事情。 问题是,callback最终会被调用,这可能会搞砸的东西! 所以是的,有没有办法阻止这个callback被执行? 我的想法是:

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

但是,这似乎不是一个很好的解决scheme,我…

你最好的select可能是使用承诺。 例如,如果你使用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) };