V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
JayLin1011
V2EX  ›  JavaScript

ECMA 标准的 Promise 对象和 Promises/A+ 标准的有什么不同之处?

  •  
  •   JayLin1011 · 2021-01-28 23:17:05 +08:00 · 2268 次点击
    这是一个创建于 1397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知,Promise 是一个社区先驱的 Built-in 对象,Promises/A+ 标准也是 ES6 Promsie 的前身,规范了 Promise 不同实现的 thenable 可交互性,主要是集中在 Promise 的构造函数本身和原型成员 then 方法的实现,ES6 Promise 则在 Promises/A+ 标准基础上添加了更多的静态成员和原型成员。

    我在自定义实现一个 ES6 Promise 的过程中出现了一些问题,即使我的 Promise 符合 Promises/A+ 标准(可以通过 promises-aplus-tests 的测试),但是和 ES6 Promise 的行为仍有一定差异,即使祂能够和原生 Promise 交互。

    目前的发现的行为或者说功能差异有以下两个:

    1. new Promise 时若 resolve 一个 Promise(或者 thenable)对象,ES6 Promise 会进行深层的 resolvePromises/A+ 标准则忽略了这一点,受影响的 API 主要是 Promise 的构造函数和 Promise.resolve() 方法;
    2. new Promise 时若 resolve 了我自己(即我等我自己完成我自己),ES6 Promisereject 一个循环链式调用的异常,Promises/A+ 标准则忽略了这一点,受影响的 API 主要是 Promise 的构造函数和 Promise.deferred() 方法;

    全知万能的 v2ex 啊, 我的问题:是否有关于 ES 标准的 Promise 对象和 Promises/A+ 标准详细比较的完整内容或者学习资源,重点是两者的其他方面的异同比较,评论区大神也可以补充分享其他的异同,求求了,这对我真的很重要。

    PS:尽量不要贴 bluebirdcore-jsPromise 源码 mock,因为我只想知道具体差异,然后尝试实现,上面列举的差异是被我发现后成功修复的部分。

    7 条回复    2021-02-14 02:43:52 +08:00
    autoxbc
        1
    autoxbc  
       2021-01-29 01:52:40 +08:00
    ECMA 的规范几乎就是伪代码,所有绕过这个试图取巧的做法都是浪费时间。为了佐证上述看法,我去看了一眼 core-js 的源码,完全就是对规范的翻译,甚至变量名都是伪代码里照搬的

    https://tc39.es/ecma262/#sec-promise-objects
    xiaody
        2
    xiaody  
       2021-01-29 06:42:23 +08:00
    我印象里 Promises/A+ 只定义了 then 的行为,并不涉及 Promise 构造函数本身和任何 Promise.resolve 之类的静态方法,所以你说的两个「差异」都是 Promises/A+ 之外的东西。
    libook
        3
    libook  
       2021-01-29 10:35:04 +08:00
    https://promisesaplus.com/implementations
    说 ES 的 Promise 就是 A+的一种实现。

    实际上应该说 ES 的 Promise 兼容 A+,你可以用 A+的用法来使用 ES Promise,不过 ES 提供了更多特性,比如 catch 、finally 、any 、allSettled 。
    可以去看看 A+的规范全文,很短,其实都是些很核心的功能,各种库的实现方案都在 A+基础上进行了功能的扩展。
    JayLin1011
        4
    JayLin1011  
    OP
       2021-01-29 16:47:26 +08:00
    @autoxbc core-js 太依赖 host 了(涉及 doceument 和 process 等),确实实现了 ES Promise,但不是对规范的完全翻译(比如考虑不同 host 的兼容性),我更倾向于 bluebird 或 q 等基于 UTDD 的实现。Promises/A+ 在我看来时 ES Promise 的子集,但我目前能获取的测试包仅能提供基于 Promises/A+ 的测试,所以才想要了解两者的差异,完善给予 ES Promise 测试。
    JayLin1011
        5
    JayLin1011  
    OP
       2021-01-31 19:19:16 +08:00 via Android
    @libook 感谢回复,我同意你的观点,A/+ 可以视为 ES Promise 的子集,目前苦恼的是莫得对针对 ES Promise 的完备性测试,以区分两者的差异。
    JayLin1011
        6
    JayLin1011  
    OP
       2021-01-31 19:30:53 +08:00 via Android
    @xiaody A/+ 告诉我们一个 Promise 有且仅有三种状态,这就是构造函数的内容。。其次,Promise 所有的静态方法都依赖于构造函数的实现(一个特殊的语法糖),因为所有的静态方法都构造并返回一个 Promise,换而言之,构造函数本身就会影响所有静态方法的实现。
    mingson
        7
    mingson  
       2021-02-14 02:43:52 +08:00
    @JayLin1011 童鞋,咋联系不上你,都到你家楼下了,搬哪了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:33 · PVG 08:33 · LAX 16:33 · JFK 19:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.