Javascript 不更改.then()中的已解析值
我有两个函数返回承诺,Javascript 不更改.then()中的已解析值,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我有两个函数返回承诺,P1和P2。首先,我想等待直到P1()完成,然后我想执行P2,当P2()完成时,我想对解析为的值P1()执行一些操作。像这样使用async/await很容易: const result = await P1() await P2() doSomething(result) P1().then((result) => P2().then(() => result)).then((result) => doSomething(result)) 但是我不能使
P1
和P2
。首先,我想等待直到P1()
完成,然后我想执行P2
,当P2()
完成时,我想对解析为的值P1()
执行一些操作。像这样使用async/await
很容易:
const result = await P1()
await P2()
doSomething(result)
P1().then((result) => P2().then(() => result)).then((result) => doSomething(result))
但是我不能使用async/await
。使用承诺,我可以这样做:
const result = await P1()
await P2()
doSomething(result)
P1().then((result) => P2().then(() => result)).then((result) => doSomething(result))
但是有没有更漂亮的方法(没有嵌套的
then
s)呢?你可以使用Promise。就像这样,它会一直等到所有的承诺都得到解决(或者第一次被拒绝)
或者更简洁一些:
Promise.all([p1, p2]).then(result => doSomething(result));
似乎P1和P2是独立的,因为您没有使用P1的值来启动P2的调用。如果是这种情况,您可以使用
.all()
方法并行运行这两个承诺,然后对它们的结果进行处理
Promise.all([P1, P2]).then(([ P1Result, P2Result ]) => {
doSomething(P1Result, P2Result);
});
但是,如果P2确实依赖于P1,那么嵌套的
。then()
将是一种方法。我创建了一个很小的模块来简化系列承诺的调用,甚至可以在同一管道上混合使用同步和异步方法。看一看,看看这是否能帮助你摆脱编写嵌套的。然后()
方法:或更简洁:承诺。所有([p1,p2])。然后(doSomething)
哈哈,或者:-我需要更新我的问题P1
和P2
应该是返回承诺的函数。我只是想让它变得更简单,但我没有意识到它有这么大的不同:)关键是,如果P2
是一个函数,我想在P1()
完成后执行它。在这种情况下,你原来的方法就是要走的路,我知道没有其他方法,所以这可能?还取决于是否要传递P1的结果?稍微短一点。。。P1()。然后(()=>P2()。然后(结果=>doSomething(结果));嵌套then
只是一个很好的解决方案,但您可以简化为P1()。然后(result=>P2()。然后(()=>doSomething(result)))