Javascript 使用承诺实现超时-抛出错误

Javascript 使用承诺实现超时-抛出错误,javascript,node.js,promise,cancellation,Javascript,Node.js,Promise,Cancellation,我试图使用promise和setTimeout为异步函数实现超时。我想运行一个异步操作,如果它在一定时间内没有完成,抛出一个错误。目前,这就是我所拥有的:(其中一些是在stackoverflow上找到的) 但是当抛出错误时,程序不会停止。有人能告诉我为什么吗?如果有更简单的方法?我将非常感激 编辑:现在第一次尝试使用bluebird,它提供了一些OperationPromised.timeout不是一个函数。我这样做对吗 var Promise = require("bluebird"); f

我试图使用promise和setTimeout为异步函数实现超时。我想运行一个异步操作,如果它在一定时间内没有完成,抛出一个错误。目前,这就是我所拥有的:(其中一些是在stackoverflow上找到的)

但是当抛出错误时,程序不会停止。有人能告诉我为什么吗?如果有更简单的方法?我将非常感激

编辑:现在第一次尝试使用bluebird,它提供了一些OperationPromised.timeout不是一个函数。我这样做对吗

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"