术语
- promise 是一个有then方法的对象或者是函数,行为遵循本规范。
- thenable 是一个有then方法的对象或者是函数。
- value 是 promise 状态成功时的值,也就是 resolve 的参数, 包括各种数据类型, 也包括 undefined/thenable 或者是 promise。
- reason 是 promise 状态失败时的值, 也就是 reject 的参数, 表示拒绝的原因
- exception 是一个使用 throw 抛出的异常值。
定义
Promise 表示一个异步操作的最终结果,与之进行交互的方式主要是 then 方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因。
简单来说:Promise 是一个拥有 then 方法的对象或者函数。
状态
- 等待态(Pending):初始状态,可改变。
- 执行态(Fulfilled):最终态,不可变,必须拥有一个 value 值。
- 拒绝态(Rejected):最终态,不可变,必须拥有一个 reason 值。
// 状态流转:
pending --> resolve(value) --> fulfilled;
pending --> reject(reason) --> rejected;
then
promise 必须提供一个 then 方法以访问其当前值、种植和据因
// 参数要求:必须是函数类型,如果不是,则被忽略。
// 这两个参数应该是 微任务。这里用queueMicrotask来实现微任务的调用
Promise.then(onFulfilled,onRejected);
- onFulfilled 特性:
- 只能被调用一次;
- 在 promise 变成 fulfilled 前不可被调用;
- 当 promise 执行结束后必须被调用,第一个参数是 promise 的终值。
- onRejected 特性:
- 只能被调用一次;
- 在 promise 变成 rejected 之前不用管被调用;
- 当 promise 执行结束后必须被调用,第一个参数是 promise 的终值。
then 方法可以被调用多次
- promise状态变成 fulfilled 后,所有的 onFulfilled 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onFulfilled的回调)
- promise状态变成 rejected 后,所有的 onRejected 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onRejected的回调)
then 应该返回一个 promise
promise2 = promise1.then(onFulfilled,onRejected);
- onFulfilled 或 onRejected 执行的结果为x, 调用 resolvePromise;
- 如果 onFulfilled 或者 onRejected 执行时抛出异常e, promise2需要被reject;
- 如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled;
- 如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected;
resolvePromise
resolvePromise(newPromise,x,resolve,reject)
- 如果 promise2 和 x 相等,那么 reject TypeError;
- 如果 x 是一个 promsie:
- 如果 x 是pending态,那么 promise 必须要在 pending,直到 x 变成 fulfilled or rejected;
- 如果 x 被 fulfilled,
fulfill promise with the same value
- 如果 x 被 rejected,
reject promise with the same reason
x.then((y) => {
this.resolvePromise(newPromise, y, resolve, reject);
}, reject);
- 如果 x 是一个 object or function
let then = x.then
- 如果 x.then 这步出错,那么
reject promise with e as the reason
- 如果 then 不是一个function,那么
fulfill promise with x
- 如果 then 是一个函数,
,then.call(x, resolvePromiseFn, rejectPromise)
3.1. resolvePromiseFn 的 入参是 y, 执行 resolvePromise(promise2, y, resolve, reject)
;
3.2. rejectPromise 的 入参是 r, reject promise with r
;
3.3. 如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略;
3.4. 如果调用then抛出异常e ,如果 resolvePromise 或 rejectPromise 已经被调用,那么忽略则,reject promise with e as the reason
。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!