深入学习Promise A+ 规范之基本介绍

787 阅读4分钟

关于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 => {

});

运行结果:

企业微信截图_1648015150723.png

  • 如果 onFulfilled 不是函数且 promise1 成功执行, promise2 必须成功执行并返回相同的值
var promise1 = new Promise((resolve, reject) => {
    resolve('promise1 resolve ok~');
});

// 如果 `onFulfilled` 不是函数且 `promise1` 成功执行, `promise2` 必须成功执行并返回相同(与promise1)的值
var promise2 = promise1.then('not function')    

运行结果:

企业微信截图_16480153129876.png

  • 如果 onRejected 不是函数且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的据因
var promise1 = new Promise((resolve, reject) => {
    reject('promise1 resolve ok~');
});

// 如果 `onRejected` 不是函数且 `promise1` 拒绝执行, `promise2` 必须拒绝执行并返回相同(与promise1)的据因
var promise2 = promise1.then(null,'not function')    

运行结果:

image.png

  • 如果 onFulfilled 或者 onRejected 返回一个值 x ,则运行的 Promise 解决过程[[Resolve]](promise2, x) Promise 解决过程详细将在 Promise A+规范之Promise解决过程详细介绍~