考虑示例:
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 的可解析值。为什么不是这样?
我了解到,这与承诺的自动“解包”有关,但是我想对幕后到底发生的事情有所了解。
答案 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解析过程是一个抽象操作,将一个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]
;