Javascript 使用承诺实现超时-抛出错误
我试图使用promise和setTimeout为异步函数实现超时。我想运行一个异步操作,如果它在一定时间内没有完成,抛出一个错误。目前,这就是我所拥有的:(其中一些是在stackoverflow上找到的) 但是当抛出错误时,程序不会停止。有人能告诉我为什么吗?如果有更简单的方法?我将非常感激 编辑:现在第一次尝试使用bluebird,它提供了一些OperationPromised.timeout不是一个函数。我这样做对吗Javascript 使用承诺实现超时-抛出错误,javascript,node.js,promise,cancellation,Javascript,Node.js,Promise,Cancellation,我试图使用promise和setTimeout为异步函数实现超时。我想运行一个异步操作,如果它在一定时间内没有完成,抛出一个错误。目前,这就是我所拥有的:(其中一些是在stackoverflow上找到的) 但是当抛出错误时,程序不会停止。有人能告诉我为什么吗?如果有更简单的方法?我将非常感激 编辑:现在第一次尝试使用bluebird,它提供了一些OperationPromised.timeout不是一个函数。我这样做对吗 var Promise = require("bluebird"); f
var Promise = require("bluebird");
function someOperation(cb) {
setTimeout(function() {
cb('', 'Done');
}, 2000);
}
var someOperationPromised = Promise.promisify(someOperation);
someOperationPromised.timeout(1).then(function (){
console.log("Finished!");
}).catch(Promise.TimeoutError, function (err) {
throw err;
});
不确定您正在使用的promise库(如果有的话)。我可以建议你吗?它比本机更快,并且有很多很棒的特性。其中呢??超时 从: 编辑: 嘿!我花了一些时间整理,试图找出为什么你的编辑不起作用。我的目标是向您证明
.timeout()
是有效的。此外,我想为您提供一个可行的解决方案,您可以使用Bluebird继续前进
下面我包括一个我命名的函数takesFourSeconds
。它返回一个承诺,该承诺将在4秒后解决。然后我调用takesFourSeconds
两次。第一次使用timeout强制承诺链拒绝超过3秒的承诺。第二次我强制它拒绝,如果它需要超过5秒
var Promise = require("bluebird");
function takesFourSeconds (){
return new Promise((resolve, reject) => {
setTimeout(function(){
return resolve('hi');
}, 4000);
});
}
takesFourSeconds().timeout(3000).then(function(res) {
console.log(res);
}).catch(Promise.TimeoutError, function(e) {
console.log("promise took longer than 3 seconds");
});
takesFourSeconds().timeout(5000).then(function(res) {
console.log(res);
}).catch(Promise.TimeoutError, function(e) {
console.log("promise took longer than 5 seconds");
});
请注意,这将返回:
$ node index.js
promise took longer than 3 seconds
hi
正如所料
小旁注:
在创建返回承诺的函数时,不必为承诺链中调用的每个函数创建新承诺。只有第一个函数
例如,如果我想在takesFourSeconds()之后调用另一个函数,我可以这样编写:
function myFunc(result){
return result === 'hi' ? resolve('hey there') : reject('hi there');
}
然后:
这应该输出:
"hey there"
给你!Bluebird.js中的超时。:) 是的。我的回答中有什么你不喜欢的吗?我向他展示了我如何知道如何解决他的问题。回答“有更简单的方法吗?”。嗯,也许,我觉得这个问题更多的是关于“有人能告诉我为什么吗?”是的,没错,我没有提到这一部分。谢谢你的回复。我试着用蓝鸟,但出现了一个错误,你知道为什么吗?我已经更新了我原来的问题,我来看看。感谢您更新您的问题。:)“程序不会停止”-你这是什么意思?您是否希望取消2秒钟的操作?不,您必须显式地这样做。您必须实际调用someOperationPromised()
,后面有参数。“程序不会停止”-这是什么意思?”是一个非常急躁的问题。一旦[[PromiseStatus]]被设置为拒绝
之后的决议将不会对承诺状态产生任何影响。同时,您的someOperation
函数将运行,但由于您需要解析它的结果并在随后阶段的onfulfillment
calback中使用它,因此它将不会产生任何结果,因为不会调用onfulfillment
回调。这就是在承诺中事情被取消的原因。
function myFunc(result){
return result === 'hi' ? resolve('hey there') : reject('hi there');
}
takesFourSeconds()
.then(myFunc) // myFunc will take in the resolved value of takesFourSeconds implicitly
.then(result => console.log(result)
.catch(error => console.log(error);
"hey there"