解决承诺中的承诺

时间:2018-07-28 10:32:59

标签: javascript node.js asynchronous promise async-await

考虑示例:

let promiseA = new Promise((res, rej) => res(10));
let promiseB = new Promise((res, rej) => res(promiseA))

promiseB.then((resolvedVal) => console.log(resolvedVal)); //Outputs 10;

我希望 resolvedVal promiseA ,而不是 promiseA 的可解析值。为什么不是这样?

我了解到,这与承诺的自动“解包”有关,但是我想对幕后到底发生的事情有所了解。

2 个答案:

答案 0 :(得分:0)

new Promise((res, rej) => res(promiseA))被称为promise construction antipattern,从来没有充分的理由这样做。

此代码

let promiseB = new Promise((res, rej) => res(promiseA))

等同于

let promiseB = promiseA;
  

我希望solvedVal是promiseA,而不是promiseA的解析值。为什么不是这样?

这是Promise的工作方式,也是此模式可用于避免回调地狱的原因。当一个Promise与then链接时,一个Promise就会成为一个值。

Promise/A+ specification所述:

  

promise解析过程是一个抽象操作,将一个promise和一个值作为输入,我们将其表示为[[Resolve]](promise,x)。如果x是可能的,则在x的行为至少类似于promise的假设下,尝试使promise采用x的状态。否则,它将履行x值的承诺。

答案 1 :(得分:0)

根据定义,您不能从承诺中返回承诺。它将始终链接并解决/拒绝。试试这个:

let promiseA = new Promise((res, rej) => res(10));
let promiseB = new Promise((res, rej) => res([promiseA]))

promiseB.then((resolvedVal) => console.log(resolvedVal));
//Outputs [promiseA]

;