【发布时间】:2015-10-08 04:06:08
【问题描述】:
我正在寻求架构建议。在 MEAN 环境中使用 Bluebird Promises(这里说的是 node.js 服务器端),我打算进行许多并发 API 调用,聚合所有结果并响应客户端。示例(伪)代码:
exports.getAllData = function(searchquery, cb) {
var results;
wrapper1.getResultsFromAPI1(searchquery, function(err,data){
results += data;
});
wrapper2.getResultsFromAPI2(searchquery, function(err,data){
results += data;
});
wrapper3.getResultsFromDataBase(searchquery, function(err,data){
results += data;
});
if (AllRequests done){
cb(null,results);
}
}
现在我不知道如何确保:
- 同时触发所有请求(不按顺序触发以减少 响应时间)
- 收到所有 API 请求的响应后响应客户端
- 如果一个 API 请求由于某种原因失败,则不会拒绝整个承诺链,从而“丢失”其他 API 响应数据。
我在 Bluebird Promise 网站上查看了合适的集合,但似乎没有一个完全符合上面列出的要求。有什么建议吗?
【问题讨论】:
-
Promise.settle应该可以。 -
如果我错了,请纠正我,但只有在解决了承诺数组中的所有项目后,解决才会解决。有一次,一个项目(在我的例子中:一个 API 调用)失败了,整个 Promise 链都失败了。这不是我需要的。
-
@IgorP。
Promise.all将在通过的 Promise 之一失败时失败。Promise.settle将为您提供一个数组作为结果,其中包含哪些承诺被拒绝以及哪些承诺被解决的信息。所以你将你的settle看看是否所有的请求都真的完成了。 -
哦,好的。那我一定是误解了网上的参考资料。我会试一试。谢谢=)
标签: javascript promise bluebird