这种使用Promises的方式是否正确?

时间:2017-02-11 11:15:47

标签: javascript ecmascript-6

我需要得到两个承诺的结果。

所以我做了以下事情:

let prom1 = findFirstThing(),
    prom2 = findSecondThing();

prom1.then(firstThing => {
      prom2.then(secondThing => {
         doSomething(firstThing, secondThing);
      })
})

它正常工作,但我不确定这是正确的做法。 我应该将它们包装在promise数组中并使用Promise.all()函数而不是这样做吗?而且,这究竟发生了什么呢?

3 个答案:

答案 0 :(得分:0)

从你的代码片段看,prom1和prom2似乎并不相互依赖,因此可以使用Promise.all一起解雇。这似乎是达到你想要的最简单,最干净的方式。

Promise.all([prom1, prom2])
  .then(([firstThing, secondThing]) => {
    doSomething(firstThing, secondThing);
  });

请注意,我在.then调用中使用了数组解构分配。

答案 1 :(得分:0)

这两种方式都是对promises的有效使用。在任何一种情况下,异步操作都是并行运行的。

要按顺序运行它们,您可以这样做:

let prom1 = findFirstThing()
prom1.then(firstThing => {
      let prom2 = findSecondThing(firstThing)
      prom2.then(secondThing => {
         doSomething(secondThing);
      })
})

这样,第二个异步操作在触发之前等待第一个异步操作解析。

只有两个并行进程才能正常工作。如果你有更多,你的方法嵌套变得丑陋。然后我会使用Promise.all()。

Promise.all()在触发列表驱动的任意数量的独立承诺时特别有用:

Promise.all(list).then(...)

Promise.all还有另外一个细微差别,它将结果按照与all相同的顺序组合成一个数组。

答案 2 :(得分:0)

  

它正常工作,但我不确定这是否正确。

当您的两个操作都失败,或者您的第二个承诺在第一次执行之前拒绝时,您的代码将导致unhandled rejection错误。如果您立即启动这两项功能,请不要尝试将其结果链接起来。

  

我应该将它们包装在promise数组中并使用Promise.all()函数而不是这样做吗?

是的,这更简单,并且会妥善处理对第二个承诺的拒绝:

return Promise.all([
    findFirstThing(),
    findSecondThing()
]).then(([firstThing, secondThing]) => {
    return doSomething(firstThing, secondThing);
}) // .then(…)

如果您想按顺序运行它们,则需要将第二个调用放在then回调中。并且不要忘记return你的结果,这样你就可以开始工作了:

return findFirstThing().then(firstThing =>
    findSecondThing().then(secondThing =>
        doSomething(firstThing, secondThing)
    )
)