承诺:抛出错误时,其他异步请求会发生什么?

时间:2015-04-30 10:48:21

标签: javascript promise bluebird

我正在使用蓝鸟的承诺。这在文档中并不是很明确。假设以下各项,假设所有实例都是适当的承诺:

FindSomeDBModel.then(function(model) {
    return [
        model.getOtherModels(),
        aHTTPRequest('https://google.com')
    ];
}).spread(function(otherModels, httpResponse) {
    // some code
}).catch(function(err) {
    res.status(500).send(err);
});
  1. 如果model.getOtherModelsaHTTPRequest都引发了错误,那么err中的catch变量会包含哪些内容?

  2. 此外,如果model.getOtherModels首先抛出错误,会导致响应发送到客户端还是等待aHTTPRequest完成?随后,aHTTPRequest抛出,然后会发生什么?

  3. 如果其中一个请求引发错误,我是否可以回复客户端?因为其他响应是否完成并成功不再是重要的。

2 个答案:

答案 0 :(得分:2)

如果在这两个承诺执行中的一个中发生错误,那么将会发生什么

  • 您的catch回拨
  • 收到错误
  • 另一个承诺不受影响,其执行继续进行
  • 您对spread的回调未被称为

如果model.getOtherModelsaHTTPRequest同时发生错误,catch只接收第一个错误,另一个将被忽略。

尽快调用您给catch的回调,当抛出第一个错误时,您的代码不会等待执行另一个错误。

答案 1 :(得分:1)

  

如果model.getOtherModels和aHTTPRequest都抛出错误,那么catch中的err变量会包含什么?

AggregateError本来是最优的,但由于与Bluebird之外指定的.all的兼容性而且bluebird兼容 - 它将通过首先拒绝解决上链。

在自己不需要ES6兼容性的方法中,bluebird将返回 all 错误。

  

另外,如果model.getOtherModels首先抛出错误,它会导致响应被发送到客户端还是等待aHTTPRequest完成呢?随后,aHTTPRequest抛出,然后会发生什么?

一旦抛出错误,它就会拒绝(并立即进入catch),bluebird有一个.spread的特殊情况,它检查传递的参数是否是一个数组并调用{{ 1}} on - 这是一个特殊情况,如果你.all而不是.then它就不会发生。

  

如果其中一个请求引发错误,我是否可以回复客户端?因为其他响应是否完成并成功不再是重要的。

是的,但考虑使用类型化(或谓词)异常来进行更有意义的错误处理 - 如果发生的错误不是.spread,则可能需要重新启动服务器。