这是我对嵌套承诺的第一次尝试。我正在使用bluebird库,但我认为所有承诺库的想法都是一样的。
在高层次上,这就是我想要做的事情:
myService.getSomeData(url)
.then((data) => {
myOtherService.getMoreData(data.uniqueId)
.then((thisDataIsAnArray) => {
//loop over the data above and do something
});
});
getMoreData()
应该进行X服务调用并将结果存储在数组X元素中。这是我开始迷路的地方,因为我不知道如何制作这种方法以及我应该从中返回什么。我在蓝鸟Promise.all
和Promise.map
采取了一些刺,但我正在挣扎,并认为我会征求建议。
答案 0 :(得分:4)
答案 1 :(得分:2)
Promise迭代在我第一次尝试它时完全扭曲了我的大脑。我认为Bluebird的文档在区分常见用例方面做得相当差,但我不会继续讨论它,因为(a)我喜欢蓝鸟,(b)我没有时间更新文档。
我觉得Promise.map
对你的情景来说是正确的。
myService.getSomeData(url)
.then((data) =>
{
return myOtherService.getMoreData(data.uniqueId)
})
.map((item) =>
{
return doSomethingWithData(item);
})
.then((results) =>
{
// do something with the result array.
});
根据您对结果的处理方式,我使用.map
的位置,您也可以使用.reduce
或.each
。请注意,.each
不会修改其链接的承诺的返回值,因此"仅用于副作用"在Bluebird文档中发表评论。
实例和静态方法之间的区别当然是静态的,你必须提供数组,例如: Promise.map(array, (item) => {})
。
另外,正如@jib所说 - 总是在回调中返回一个值。这将为您节省很多痛苦。