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?