ECMA 标准的 Promise 对象和 Promises/A+ 标准的有什么不同之处? - V2EX
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 2776 次点击
    这是一个创建于 1717 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知,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
    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     Solana     2728 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 14:42 PVG 22:42 LAX 07:42 JFK 10:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86