Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不更改.then()中的已解析值_Javascript_Promise_Es6 Promise - Fatal编程技术网

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)))