我需要得到两个承诺的结果。
所以我做了以下事情:
let prom1 = findFirstThing(),
prom2 = findSecondThing();
prom1.then(firstThing => {
prom2.then(secondThing => {
doSomething(firstThing, secondThing);
})
})
它正常工作,但我不确定这是正确的做法。 我应该将它们包装在promise数组中并使用Promise.all()函数而不是这样做吗?而且,这究竟发生了什么呢?
答案 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)
)
)