解决父承诺中的一系列承诺

这是我在嵌套承诺的第一枪。 我正在使用蓝鸟图书馆,但我认为这个想法对所有的承诺库都是一样的。

在高层次上,这是我想要做的:

myService.getSomeData(url) .then((data) => { myOtherService.getMoreData(data.uniqueId) .then((thisDataIsAnArray) => { //loop over the data above and do something }); }); 

getMoreData()应该使X服务调用并将结果存储在数组X元素long中。 这是我开始迷失的地方,因为我不知道如何制定这个方法,我应该从中返回。 我已经对蓝鸟的Promise.allPromise.map采取了一些刺激,但我很挣扎,并认为我会征求意见。

归还所有的承诺!

Promise只是您附加callback的返回值 ,而不是将callback传递给函数。 除非你全部归还,否则callback链接或者抓住所有错误是没有办法的。

而且,从所有的那.then 。 这使事情变平了。

第一次尝试时,Promise迭代完全扭曲了我的大脑。 我认为蓝鸟的文档在区分常见用例方面做得相当差,但我不会继续讨论这个问题,因为(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你也可以使用.each.each 。 请注意.each不会修改链接的承诺的返回值,因此Bluebird文档中的“仅用于副作用”评论。

当然,实例和静态方法之间的区别是,你必须提供数组,例如Promise.map(array, (item) => {})

另外,正如@jib所说 – 总是在你的callback中返回一个值。 这样可以节省很多痛苦