不要在.then()中更改已解析的值

时间:2017-11-22 13:22:25

标签: javascript promise es6-promise

我有2个返回承诺的函数,P1P2。首先,我想等到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)?

2 个答案:

答案 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