解决父承诺中的一系列承诺
这是我在嵌套承诺的第一枪。 我正在使用蓝鸟图书馆,但我认为这个想法对所有的承诺库都是一样的。
在高层次上,这是我想要做的:
myService.getSomeData(url) .then((data) => { myOtherService.getMoreData(data.uniqueId) .then((thisDataIsAnArray) => { //loop over the data above and do something }); });
getMoreData()
应该使X服务调用并将结果存储在数组X元素long中。 这是我开始迷失的地方,因为我不知道如何制定这个方法,我应该从中返回。 我已经对蓝鸟的Promise.all
和Promise.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中返回一个值。 这样可以节省很多痛苦