本文根据官网文档翻译,能力有限,有问题欢迎指正
概述
Promises是一个可靠并可交互的JavaScript标准;被开发者制定,供所有开发者参考。
promsise表示异步操作的最终结果,通过then方法进行主要交互,该方法可注册两个回调方法(1、接受promise最终值 2、接受promise失败的错误原因)
此规范详细的规定了then方法的实现,为所有遵循Promises/A+规范的promises实现提供可靠的基础,因此可以认为该规范是非常稳定的,尽管Promises/A+组织偶尔可能会修改此规范,但是都是采用较小的向后兼容方式来解决一些极端情况,同时会经过仔细考虑、讨论和测试后,我们才会集成大型或向后不兼容的修改。
从历史来看,Promises/A+规范接受了早期的一些建议,同时扩展了一些好的规则,去掉了原规范的特殊情况和有问题的部分
最后,Promises/A+核心规范并没有涉及如何创建、解决或者拒绝promise,而是选择专注提供可通用的then方法,对于上述操作promise方法可能在其他规范中提及。
1. 术语
1.1. “promise”是一个具有then方法的对象或者函数,其行为遵循Promises/A+规范
1.2. “thenable”是一个定义then方法的对象或者函数
1.3. “value”是任意的JavaScript变量(包括undefined,thenable或promise对象)
1.4. “exception”是使用throw语句抛出的一个值
1.5. “reason”是一个promise被rejected的说明
2. 要求
2.1. promise状态-必须是以下三种状态中的一种,等待状态(pending)、已完成(fulfilled)和 被拒绝(rejected)
2.1.1. 当promise处于pending时:
2.1.1.1. 只能改变成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方法,以便能访问当前状态、终值或被拒原因,then方法接受两个参数;
1 | 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. 如果onFulfilled是一个方法:
2.2.3.1. 如果promise状态为rejected,这个方法必须被执行,并且第一个参数必须是promise的被拒绝的原因
2.2.3.2. 如果promise没有rejected之前,不能被调用
2.2.3.3. 这个方法只能被调用一次
2.2.4. onFulfilled和onRejected必须在执行环境堆栈仅包含平台代码时才可被调用[3.1]
2.2.5. onFulfilled和onRejected必须作为函数被调用[3.2]
2.2.6. then方法可以在一个promise上执行多次:
2.2.6.1. 如果promise是fulfilled时候,所有onFulfilled将按照传入then方法的顺序依次执行
2.2.6.2. 如果promise是rejected时候,所有onRejected将按照传入then方法的顺序依次执行
2.2.7. then方法必须返回一个promise[3.3]:
1 | promise2 = promise1.then(onFulfilled, onRejected); |