javascript - Promises/A+ 规范和 ECMAScript 承诺之间可能存在矛盾?
问题描述
断言ECMAScript 承诺是Promises/A+ 实现,因此它们没有矛盾。但是,我遇到了一个据称与 Promises/A+ 不一致的 ecma promises 行为。
当我们调用promise1.then(onFulfilled, onRejected)
监听promise1
的输出时,我们得到另一个 promise () 作为返回值promise2
。当所需的回调 ( onFulfilled/onRejected
) 被执行并且它反过来返回一些值时,规范规定使用定义的函数x
来解决它。[[Resolve(promise2, x)]]
假设x
碰巧是一个promise本身(x === promise3
),那么必须采取的步骤如下:
- 如果
x
是一个承诺,采用它的状态:- 如果
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 promises不进行预期的类型检查并且只检查是否x
有then
方法吗?
解决方案
假设
x
碰巧是一个承诺本身,那么必须采取的步骤如下:[…]
不,它们不需要被采纳——只有x
在“承诺”的情况下才会被采纳。这些步骤是可选的(“允许”,而不是“必需”)优化:
注 4:一般来说,只有当它来自当前的实现时
,才会知道它是一个真正的 Promise。x
本条款允许使用特定于实现的方法来采用已知符合承诺的状态。
ECMAScript 不会将其自己Promise
的 s 视为“已知符合”,忽略这些步骤。他们只是像对待所有其他 thenables 一样对待原生 Promise。鉴于无法创建一个Promise
用另一个 promise 实现的 ECMAScript ,这相当于直接采用状态。
推荐阅读
- winforms - csv文件的OleDB连接字符串的正确格式是什么
- excel - 来自工作簿单元格的 Excel VBA 实时用户窗体标签
- excel - EXCEL - 使用 INDEX,MATCH 查找文件编号.. 但文件编号被回收。希望添加等于或在“日期”之后的条件
- android-studio - 我可以根据 productFlavors 加载功能模块吗?
- javascript - kibana-plugins 中 kibana 类型的自动完成
- apache-flink - Apache Flink - 在尊重最大并行度的同时重新调整工作
- date - 按日期批量创建带有子文件夹的文件夹
- c# - 应用程序洞察记录错误所用的确切时间是多少
- django - Django 开发服务器显示错误的项目数据
- html - React - 根页面上的活动类