关于Promise会分两部分介绍,第一部分是关于规范解读(基本介绍和Promise解决过程),第二部分是是根据规范实现Promise(分为上下两部分),而看懂规范是实现Promise的基础,因此建议先对着规范看本篇解读。
规范本身偏理论,比较苦涩,解读会对较难理解的部分结合Promise实例来辅助理解~
1、概述
Promise A+规范是一个开放、健全且通用的JavaScript Promise标准。由开发者制定、供开发者参考。是开发者实现Promise库的标准规范。
规范的核心是制定了Promise的状态、状态的扭转规则、then方法的实现、如何处理异常、Promise解决过程,余下的静态方法all、race等并不在规范范围之内,是开发者自行实现的。
Promise 表示一个异步操作的最终结果; 与之进行交互的方式主要是 then 方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因(拒因)。
核心的 Promises/A+ 规范不设计如何创建、解决和拒绝 promise,而是专注于提供一个通用的 then 方法。
2、术语
- Promise 是一个拥有then方法的对象或者函数,其行为符合本规范;
理解:一个Promise对象,其拥有then方法。
var promise1 = new Promise((resolve, reject) => {
resolve('resolve:OK~');
});
promise1.then(value => {
console.log(`onFulfilled:`, value);
})
- thenable 是一个定义了拥有then方法的对象或函数,比如上面的Promise;
理解:拥有then方法的对象或者函数,比如实现了的Promise就是thenable。
- 值(value) 指的是任何JavaScript的合法值(包括undefined、thenable和promise)
理解:resolve(x), x就是value
- 拒因 表示promise的拒绝原因
var promise1 = new Promise((resolve, reject) => {
reject('reason,拒因')
});
promise1.then(value => {
console.log(`onFulfilled:`, value);
}, reason => {
//reason就是拒因
console.log(`onRejected:`, reason);
})
- 异常(exception) 是使用throw语句抛出的异常,其实有异常也是被拒绝reject,异常原因会被作为拒因
var promise1 = new Promise((resolve, reject) => {
new Throw Error('Error');
});
promise1.then(value => {
console.log(`onFulfilled:`, value);
}, reason => {
console.log(`onRejected:`, reason);
})
3、要求
(1)Promise的状态
一个Promise的当前状态必须为以下三种状态的一种:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)
- 等待态 处于等待态,需满足以下条件:
可以转移到执行态或拒绝态
- 执行态 处于执行状态的时候,必须满足以下条件~:
1、不能迁移至其任何其他的状态
2、必须拥有一个不可变的终值(value)
- 拒绝态 处于执行状态的时候,promise必须满足以下条件~:
1、不能迁移至其任何其他的状态
2、必须拥有一个不可变的拒因(reason)
不可变指的是恒等(即可用===判断相等),而不是意味着更深层次的不可变;
理解:如果是引用类型的话,引用地址不可变,属性可以变, 可以思考下以下两段代码会打印出啥?
//片段一
var gloabObj = {};
var promise = new Promise((resolve, reject) => {
resolve(gloabObj)
});
gloabObj.name = 'lls';
promise.then(value => {
console.log('这里应该打印出啥',value);
})
//片段二
var gloabObjA = {}, gloabObjB = {age: 12};
var promise = new Promise((resolve, reject) => {
console.log(`1111====1111`, gloabObj);
resolve(gloabObj)
console.log(`2222====2222`, gloabObj);
});
console.log(`3333====3333`, gloabObj);
gloabObj = gloabObjB;
console.log(`4444====4444`, gloabObj);
promise.then(value => {
console.log(value);
})
(2)Then方法
一个 promise 必须提供一个 then 方法以访问其当前值(value)、终值(value)和拒因(reason)
promise 的 then 方法接受两个参数,参数可选,且如果不是函数必须忽略~
promise.then(onFulfilled, onRejected)
(1)、 onFulfilled 特性
如果onFulfilled是函数,
- 当promise执行结束之后其必须被调用,第一个参数是promise的终值
- 当promise执行结束之前不可被调用,
- 其调用次数不可多于一次
(2)、onRejected 特性
如果onRejected是函数,
- 当promise执行结束之后其必须被调用,第一个参数是promise的拒因
- 当promise执行结束之前不可被调用,
- 其调用次数不可多于一次
(3)、返回
then 方法必须返回一个 promise 对象
promise2 = promise1.then(onFulfilled, onRejected);
- 如果
onFulfilled或者onRejected抛出一个异常e,则promise2必须拒绝执行,并返回拒因e
var promise1 = new Promise((resolve, reject) => {
resolve('promise1 resolve ok~');
});
// 如果 onFulfilled 或者 onRejected 抛出一个异常 e ,则 promise2 必须拒绝执行,并返回拒因 e
var promise2 = promise1.then(value => {
throw new Error('promise1 then Error')
}, reason => {
});
运行结果:
- 如果
onFulfilled不是函数且promise1成功执行,promise2必须成功执行并返回相同的值
var promise1 = new Promise((resolve, reject) => {
resolve('promise1 resolve ok~');
});
// 如果 `onFulfilled` 不是函数且 `promise1` 成功执行, `promise2` 必须成功执行并返回相同(与promise1)的值
var promise2 = promise1.then('not function')
运行结果:
- 如果
onRejected不是函数且promise1拒绝执行,promise2必须拒绝执行并返回相同的据因
var promise1 = new Promise((resolve, reject) => {
reject('promise1 resolve ok~');
});
// 如果 `onRejected` 不是函数且 `promise1` 拒绝执行, `promise2` 必须拒绝执行并返回相同(与promise1)的据因
var promise2 = promise1.then(null,'not function')
运行结果:
- 如果
onFulfilled或者onRejected返回一个值x,则运行的 Promise 解决过程:[[Resolve]](promise2, x)Promise 解决过程详细将在 Promise A+规范之Promise解决过程详细介绍~