promise学习笔记
Promise A+ 规范
术语
- promise 有then 方法的对象或者函数
- thenable 是一个有then方法的对象或者是函数
- value promise 状态成功时的值, resolve(value), string number boolean undefined thenable promise
- reason promise 状态失败时的值, reject(reason)
- exception 使用throw 抛出的异常
规范
Promise States
有三种状态, 状态之间的流转关系
- pending
1.1 初始状态,可改变
1.2 在resolve 和reject 前都处于这个状态
1.3 通过resolve —> fulfilled 状态
1.4 通过reject —> rejected 状态 - fulfilled
2.1 最终态,不可更改
2.2 一个promise 被 resolve 之后变成这个状态
2.3 必须有一个value 的值 - rejected
3.1 最终态,不可变
3.2 一个promise 被reject之后会变成这个状态
3.3 必须拥有一个reason
总结一下:
pending --> resolve(value) --> fulfilled
pending --> reject(reason) --> rejected
then
promise 应该提供一个then方法,用来访问最终的结果,无论value 还是reason。
Promise.then(onFulfilled,onRejected)
-
参数规范
1.1 onFulfilled 必须是函数类型,如果传入的不是函数,应该被忽略。
1.2 onRejected 必须是函数类型,如果传入的不是函数,应该被忽略。 -
onFulfilled特性
2.1 在promise变成fulfilled 时,应该调用onFulfilled, 参数是value。(onFulfilled的执行时机?)
2.2 在promise 变成 fulfilled之前,不应该调用 onFulfilled
2.3 只能被调用一次(怎么实现只调用一次) -
onRejected 特性
3.1 在promise变成rejected 时,应该调用onRejected, 参数是reason。
3.2 在promise 变成 fulfilled之前,不应该调用 onRejected
3.3 只能被调用一次 -
onFulfilled 和 onRejected应该是在微任务阶段执行
实现promise 的时候,如何去生成微任务
-
then 方法可以被调用多次
5.1 Promise 状态 变成 fulfilled的 之后 ,所有的onFulfilled 回调 都需要按照注册的顺序执行。也可以理解为按照.then 的顺序执行
5.2 promise 状态变成rejected之后,所有的onRejected 回调 都需要按照注册的顺序执行。也可以理解为按照.then 的顺序执行 -
返回值
then 应该返回一个 promise
const promise2 = promise.then(onFulfilled,onRejected)
6.1 onFulfilled 或 onRejected 执行结果为 x,调用 resolvePromise
6.2 onFulfilled 或 onRejected 执行过程中抛出了异常,promise2 需要被reject
6.3 如果onFulfilled 不是一个函数,promise2 以 promise1 的value 触发 fulfilled
6.4 如果 onRejected 不是一个函数, promise2 以 promise1 的reason 触发 fulfilled
- resolvepPomise
resolvepPomise(promise2, x, resolve, reject)
7.1 如果promise2 和x相等,reject typeError
7.2 如果x 是一个promise
如果x 是pending状态。 promise 必须要走pending 状态,直到 x的状态变更
如果x 是 fulfilled, value --> fulfilled
如果 x 是 rejected , reason -- > rejected
7.3 如果x 是一个Object 或者 Function
去获取 x.then(const then = x.then), 如果报错, reject reason
如果 then 是 函数, 则去调用 then.call(x, resolvepPomiseFn, rejectpromiseFn);
第二部分
一步步实现一个Promise
- const promise = new Promise(); // 代表Promise 应该是一个构造函数或者 class
- 定义三种状态
- 初始化状态
- resolve 和 reject 方法
4.1 这两个方法要更改status, 从 pending 变成 fulfilled / rejected;
4.2 入参 分别是 value / resson。 - 对于实例化Promise 时的入参处理
5.1 入参是一个函数, 接受resolve 和reject 两个参数
5.2 初始化promise的时候,就需同步执行这个函数,并且有任何的报错都需要通过 reject抛出去 - then 方法
6.1 入参定义 , then 接收两个参数, onFulfilled 和 onRejected
6.2 检查并处理参数,如果参数不是函数,则忽略
6.3 根据当前promise的状态,调用不同的函数
6.4 首先我们要拿到所有的回调。新建两个数组,分别存储成功和失败的回调,调用then 的时候,如果还是 pending状态就存入数组
6.5 在 status 发生变化的时候,执行回调。用到getter setter ,监听status的变化,在发生变化的时候来做对应的操作 - then的返回值
7.1 如果onFulfilled 或者 onRejected 抛出一个异常额,那么新的promise必须 reject e;
7.2 返回值应该是一个promise
7.3 如果onFulfilled 不是函数,且promise1成功执行,promise2 必须返回同样的状态 和value
7.4 如果onRejected 不是函数,且promise1拒绝执行,promise2 必须返回同样的状态 和reason
7.5 如果onFulfilled 或者 onRejected 返回一个值x,运行resolvePromise方法。 - resolvePromise
- onFulfilled 和 onRejected 微任务
未完待续。。。