从父承诺中解析一系列承诺

时间:2016-05-06 21:12:42

标签: javascript promise bluebird

这是我对嵌套承诺的第一次尝试。我正在使用bluebird库,但我认为所有承诺库的想法都是一样的。

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

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

getMoreData()应该进行X服务调用并将结果存储在数组X元素中。这是我开始迷路的地方,因为我不知道如何制作这种方法以及我应该从中返回什么。我在蓝鸟Promise.allPromise.map采取了一些刺,但我正在挣扎,并认为我会征求建议。

2 个答案:

答案 0 :(得分:4)

Return all the promises!

Promise只是返回值您附加回调,而不是将回调传递给函数。除非你返回所有这些,否则回调无法链接或捕获所有错误。

此外,在你有另一个承诺的瞬间从所有.then返回。这使事情变得平坦。

答案 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所说 - 总是在回调中返回一个值。这将为您节省很多痛苦。