我正在使用蓝鸟的承诺。这在文档中并不是很明确。假设以下各项,假设所有实例都是适当的承诺:
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);
});
如果model.getOtherModels
和aHTTPRequest
都引发了错误,那么err
中的catch
变量会包含哪些内容?
此外,如果model.getOtherModels
首先抛出错误,会导致响应发送到客户端还是等待aHTTPRequest
完成?随后,aHTTPRequest
抛出,然后会发生什么?
如果其中一个请求引发错误,我是否可以回复客户端?因为其他响应是否完成并成功不再是重要的。
答案 0 :(得分:2)
如果在这两个承诺执行中的一个中发生错误,那么将会发生什么
catch
回拨spread
的回调未被称为如果model.getOtherModels
和aHTTPRequest
同时发生错误,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
,则可能需要重新启动服务器。