翻译: https://promisesaplus.com/
Javascript Promise是一个全面、通用的开放标准,由开发者指定,为开发者参考。
Promise代表异步操作的最终结果。与promise对象交互的主要方式是通过.then()方法,then()方法注册了回调函数,用于接收最终结果或者拒绝的原因。
这个规范详细说明了.then方法的执行流程,为所有遵循Promises/A+标准的开发者提供共用的基础。严格来说,本规范相当稳定了。尽管Promises/A+组织为了处理一些新发现的边角问题,偶尔可能会修改本规范,这些修改时微小的,向后兼容的,我们仅仅会在深思熟虑、讨论、测试之后修改较大且向后不兼容的部分。
从历史来说,Promises/A+把早期的Promises/A+建议明确了行为规范,扩展了原有的约定俗成的行为,并删除了不明确的或有问题的部分。
最后呢,Promises/A+规范的核心不是对promise如何创建、解决、拒绝,而是集中力量提供一个通用的then方法。未来,这些方法可能会用在其他规范中。

1. 术语

1.1 “promise”是一个带有then方法的对象或函数,其行为符合本规范;
1.2 “thenable”是一个定义了then方法的对象或函数;
1.3 值(“value”)是任何一个JavaScript合法值(包括undefined,a thenable, 或者a promise)
1.4 异常( “exception”)是使用throw抛出来的一个值
1.5 原因(“reason”)表示promise状态为rejected时的值。

2. 必要条件

2.1 Promise状态

一个promise当前状态必须是 pending, fulfilled, rejected中一种。
2.1.1 promise状态为pending
2.1.1.1 promise状态可能会转成fulfilled或rejected
2.1.2 promise状态为fulfilled
2.1.2.1 不能再转化为其他状态;
2.1.2.2 必须有一个不变的值;
2.1.3 promise状态为rejected
2.1.3.1 不能再转化为其他状态;
2.1.3.2 必须有一个不变的原因;
这里的不可变指的是恒等(即 ===),而不是深层次的不可变。

2.2 then方法

promise必须提供一个then方法来访问当前值或最终结果或者拒绝原因。
Promise的then方法接收两个参数:

promise.then(onFulfilled, onRejected)

2.2.1 onFulfilled, onRejected两个都是可选参数
2.2.1.1 如果onFulfilled不是函数,必须被忽略
2.2.1.2 如果onRejected不是函数,必须被忽略
2.2.2 如果onFulfilled是函数
2.2.2.1 它必须在promise是fulfilled状态后(即成功后)被调用,他的第一个参数就是promise终值;
2.2.2.2 它在promise状态变成fulfilled之前不能被调用
2.2.2.3 他只能被调用一次
2.2.3 如果onRejected是函数
2.2.3.1 它必须在promise是rejected状态后(即失败后)被调用,他的第一个参数就是promise终值;
2.2.3.2 它在promise状态变成rejected之前不能被调用
2.2.3.3 他只能被调用一次
2.2.4 onFulfilled 或 onRejected只有在执行环境栈中包含平台代码时才能被调用
2.2.5 onFulfilled 和onRejected必须作为函数被调用(没有this值)
2.2.6 then方法可能被同一个promise调用多次
2.2.6.1 promise状态是fulfilled(成功执行)时,所有onFulfilled回调函数按照注册顺序调用;
2.2.6.2 promise状态是rejected(执行失败)时,所有onRejected回调函数按照注册顺序调用;
2.2.7 then必须返回一个promise

 promise2 = promise1.then(onFulfilled, onRejected);

2.2.7.1 如果onFulfilled 或 onRejected返回一个值x,promise解决过程:

[[Resolve]](promise2, x)

2.2.7.2 如果onFulfilled 或 onRejected抛出一个异常e,promise2必须拒绝执行,返回e
2.2.7.3 如果 onFulfilled 不是函数并且 promise1 成功执行, promise2 必须成功执行并返回相同的值
2.2.7.4 如果 onRejected 不是函数并且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的原因

2.3 promise解决过程

promise解决过程是一个抽象操作,当输入一个promise或一个值,我们用[[Resolve]](promise, x)表示,如果x是一个thenable,假如它表现得像a promise,它会使promise尝试接受x的状态,否则会用x值执行promise。
thenables的特性使promise的实现具有通用性,只要它们暴出一个遵循Promises/A+规范的then方法。并且它也使遵循 Promise/A+ 规范的实现可以接受那些不符合规范但合理的then方法的实现。
执行 [[Resolve]](promise, x) 需遵循以下步骤:
2.3.1 如果promise与x指向同一个对象,以TypeError拒绝执行promise
2.3.2 如果x是一个promise,就会接受他的状态
2.3.2.1 如果 x 处于pending, promise 需保持为pending直至 x变成fulfilled或rejected,
2.3.2.2 如果 x 处于fulfilled,用相同的值执行 promise
2.3.2.3 如果 x 处于rejected,用相同的据因拒绝 promise
2.3.3 如果x是一个对象或函数
2.3.3.1 把 x.then 赋值给 then
2.3.3.2 如果x.then抛出异常e,则以e为原因拒绝promise
2.3.3.3 如果 then 是函数,将 x 作为 this 调用。传递两个回调函数作为参数,第一个参数叫做 resolvePromise ,第二个参数叫做 rejectPromise:
2.3.3.3.1 如果 resolvePromise 以值 y 被调用,则执行 [[Resolve]](promise, y)
2.3.3.3.2 如果 rejectPromise 以 r 为被调用,则以 r 拒绝 promise
2.3.3.3.3 如果 resolvePromise 和 rejectPromise 都被调用,或者被同一参数调用了多次,则优先采用首次调用,忽略剩下的调用
2.3.3.3.4 如果调用 then 方法抛出了异常 e
2.3.3.3.4.1 如果 resolvePromise 或 rejectPromise 已经被调用,则忽略它
2.3.3.3.4.2 否则以 e 为原因拒绝 promise
2.3.3.4 如果 then 不是函数,以 x 为参数执行 promise
2.3.4 如果 x 不为对象或者函数,以 x 为参数执行 promise
如果一个 promise 是通过循环的 thenable 链中的对象解决的,而 [[Resolve]](promise, thenable) 的递归性质又使得其被再次调用,根据上述的算法将会陷入无限递归之中。算法虽不强制要求,但也鼓励施者检测这样的递归是否存在,若检测到存在则以一个可识别的 TypeError 来拒绝 promise。

Promises/A+规范中文翻译相关推荐

  1. DDS (Data Distribution Service) 数据分发服务-规范中文翻译_001

    DDS (Data Distribution Service) 数据分发服务-规范中文翻译_001 1. 概述 1.1 简介 DDS规范描述了用于分布式应用程序通信和集成的以数据为中心的发布 - 订阅 ...

  2. DDS (Data Distribution Service) 数据分发服务-规范中文翻译-1

    Preface 序言 声明:本人非专业翻译,如有错误可留言. 如上所述,OMG规范处理中间件,建模和垂直领域框架.所有OMG正式的规格都可以从这个网址获取: http://www.omg.org/sp ...

  3. DDS (Data Distribution Service) 数据分发服务-规范中文翻译_003

    DDS (Data Distribution Service) 数据分发服务-规范中文翻译_003 2.以数据为中心的订阅发布(DCPS) 2.2 平台无关模型(Platform Independen ...

  4. DDS (Data Distribution Service) 数据分发服务-规范中文翻译_006

    DDS (Data Distribution Service) 数据分发服务-规范中文翻译_006 2.以数据为中心的订阅发布(DCPS) 2.2 平台无关模型(Platform Independen ...

  5. DDS (Data Distribution Service) 数据分发服务-规范中文翻译

    翻译 DDS (Data Distribution Service) 数据分发服务-规范中文翻译_005 DDS (Data Distribution Service) 数据分发服务-规范中文翻译_0 ...

  6. glTF规范中文翻译

    在查看glTF官方规范时顺便翻译了规范内容. 资源位置:https://download.csdn.net/download/u010447508/12566266

  7. 实时发布订阅协议(RTPS)DDS互操作网络协议规范-中文翻译_007

    关键字:OMG,RTPS,DDS The Real-time Publish-Subscribe Protocol (RTPS) DDS Interoperability Wire Protocol ...

  8. 实时发布订阅协议(RTPS)DDS互操作网络协议规范-中文翻译_006

    关键字:OMG,RTPS,DDS The Real-time Publish-Subscribe Protocol (RTPS) DDS Interoperability Wire Protocol ...

  9. Promises/A+规范(中文翻译)

    文章目录 Promises/A+规范(中文翻译) 1. 术语 2. 必要条件 2.1 Promise 的状态 2.2 Then 方法 2.3 Promise 解决过程 3. 注释 4. 参考 Prom ...

最新文章

  1. 沈向洋:读论文的三个层次
  2. 国产数据库建模工具,看到界面第一眼,良心了! ​
  3. UIButton或UILabel加个下划线
  4. Mac上command not found: vituralenv
  5. (22)css3新增边框圆角属性border-radius
  6. Quartz.Net 使用
  7. 使用c++制作微服务计算服务
  8. 432.全O(1)的数据结构
  9. 九九乘法表的简单代码
  10. 联机侠控制台JAVA_我的世界MultiMc启动器
  11. 拼多多爆款选择要分析哪些数据?如何采集这些爆款到拼多多?
  12. 【web-攻击用户】(9.3.2)诱使用户执行操作--请求伪造——UI伪装
  13. 史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」
  14. 大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作
  15. 中国武术高手要在郑州开比武大会?还请了马云做裁判?
  16. 青可儿——名副其实的“三好饼干”
  17. mysql 存储时间应该是时间戳还是时间_3分钟短文 | MySQL存时间,到底该用timestamp还是datetime?...
  18. 论C语言与PYTHON的优劣
  19. c#与西门子smart200联合使用
  20. 渗透技巧笔记 - 落泪红尘

热门文章

  1. java巴特沃斯滤波器编程_巴特沃斯(Butterworth)滤波器 (1)
  2. c语言程序设计2014春第一套作业,C语言程序设计2014春第一套作业
  3. P1115 最大子段和
  4. 如何用计算机辅助语言学习英语,计算机辅助下语言学习教学模式研究
  5. 连续 3 天,企业容器应用实战营上海站来啦!
  6. C#-集合练习 107
  7. 《堡垒之夜》中你可能没注意到的设计
  8. FunPlus特效专家张韶勇:如何利用跨平台工具快速制作像素动画?
  9. 【蓝桥杯省赛】冲刺练习题【动态规划】倒计时【08】天
  10. 18道经典MySQL面试题,祝您升职加薪