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;
但这对我来说似乎不是一个很好的解决方案......
答案 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)
};