我有2个返回承诺的函数,P1
和P2
。首先,我想等到P1()
完成,然后我想执行P2
,当P2()
成就时,我想做一些值P1()
解决的问题。这样使用async/await
很容易:
const result = await P1()
await P2()
doSomething(result)
但我无法使用async/await
。使用promises我可以这样做:
P1().then((result) => P2().then(() => result)).then((result) => doSomething(result))
但有没有更漂亮的方法(没有嵌套then
s)?
答案 0 :(得分:4)
您可以像这样使用Promise.all,等待所有承诺都解决(或第一次拒绝)。
Promise.all([p1, p2]).then(result => {
doSomething(result);
});
或更简洁:
Promise.all([p1, p2]).then(result => doSomething(result));
答案 1 :(得分:1)
似乎P1和P2是独立的,因为你没有使用P1的值来启动P2的调用。如果是这种情况,您可以使用.all()
方法并行运行这两个承诺,然后对其结果执行某些操作。
Promise.all([P1, P2]).then(([ P1Result, P2Result ]) => {
doSomething(P1Result, P2Result);
});
但是,如果P2确实取决于P1,那么嵌套的.then()
将是最佳选择。我创建了一个小模块来简化系列中的promises调用,甚至可以在同一个管道上混合同步和异步方法。看看是否可以帮助您摆脱编写嵌套的.then()
方法:https://github.com/DiegoZoracKy/pipe-functions