【发布时间】:2021-05-26 16:04:31
【问题描述】:
assertedECMAScript 承诺是一个 Promises/A+ 实现,所以它们没有矛盾。但是,我遇到了一个据称不符合 Promises/A+ 的 ecma promises 行为。
当我们调用promise1.then(onFulfilled, onRejected) 来监听promise1 的输出时,我们得到另一个promise (promise2) 作为返回值。当执行所需的回调 (onFulfilled/onRejected) 并返回一些值 x 时,规范规定使用定义的 [[Resolve(promise2, x)]] 函数解决它。假设x恰好是一个promise本身(x === promise3),那么the steps必须取如下:
- 如果
x是一个promise,采用它的状态:- 如果
x处于待处理状态,则promise2必须保持待处理状态,直到x被满足或拒绝。- 如果/当满足
x时,使用相同的值满足promise2。- 如果/当
x被拒绝时,以同样的理由拒绝promise2。
我想知道如果x 最终实现了另一个承诺 (promise4) 会怎样(没有任何阻碍,是吗?)。从规范摘录中可以得出结论,promise2 也必须用promise4 来满足。但在 ECMAScript 世界中似乎并非如此:
let promise4 = new Promise((resolve) => { resolve(4) })
let promise3 = new Promise((resolve) => {
resolve(promise4);
});
let promise1 = new Promise((resolve) => {
resolve(1);
});
let promise2 = promise1.then((val) => { return promise3 });
promise2.then(val => console.log(val)); // output: 4
换句话说,promise2 由promise4 的值实现。这种行为类似于规范中为其他thenable 对象定义的行为。那么 ECMAScript 的 promise 不进行预期的类型检查,只检查 x 是否有 then 方法?
【问题讨论】:
-
"...
promise2也必须满足promise4。但在 ECMAScript 世界中似乎并非如此" - 正如您自己提到的输出console.log(val)的4是promise4的“值”,那么问题出在哪里? -
@Andreas
promise3(x) 满足promise4而不是4。规范说promise2必须满足x的值而不是promise4的值。 -
promise3是promise4,promise2是promise3->console.log(val)记录4promise4的“值” -
@Andreas 为什么
promise3的值是promise4的值(即4)而不是promise4本身?我的误解就在这里。你的意思是resolve(4)和resolve(promise4)没有区别?但我认为它不是从规范中得出的。可能 ECMAScriptresolvecb 不是实现我应该深入研究 ECMAScript 规范的承诺的直接方式.. -
"
Promise.resolve()方法返回一个使用给定值解析的Promise对象。如果该值是一个承诺,则返回该承诺;如果该值是一个 thenable (即有一个"then" method),返回的promise将“跟随”那个thenable,采用它的最终状态;否则返回的promise将用该值实现。”
标签: javascript promise