(译)Promise与异步编程(一):Promises / A+翻译版

681 阅读3分钟

前言

作为一个前端开发者,Promise已然成为了在开发生/生产过程中一把神兵利器,笔者也在网上看到过很多关于Promise的文章,跟着大佬们的步伐,偷偷的做了一些笔记。在这里笔者系统的总结了如何一步一步的单撸自己的Promise源码,让读者在面试过程中如何轻松应对。

当然,想要单撸Promise,不能一口吃个大胖子。要搞清楚Promise是什么,实现标准是什么,如何根据标准实现自己的Promise。

本文是单撸Promise源码的第一篇文章,旨在对Promises/A+的实现标准进行了翻译整理。希望对正在阅读的你有所帮助。

官方文档说明,请戳传送点Promises/A+

1.术语

1.1. promise是一个有 then 方法的对象或者函数,行为遵循这个规范

1.2. thenable 是一个有then 方法的对象或者函数

1.3. value是promise状态成功的值(包括undefined/thenable或者promise)

1.4. exception是一个使用throw抛出的异常值

1.5. reason是promise 状态失败时的值

2.要求

2.1 Promise States

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 必须有一个value值
  • 2.1.3如果promise在rejected状态
2.1.3.1 不会变成其他状态
2.1.3.2 必须有一个promise被reject的reason

tip:promise的状态只能从 pending 变成 fulfilled ,或者从 pending 变成 rejected 。promise 成功有成功的value;promise失败的话,又失败的reason。

2.2 then 方法

promise 必须提供一个 then 方法,来访问最终的结果。 promise 的 then 方法接收两个参数

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时,调用 onFulfilled ,参数是 promise 的 value
2.2.2.2 在 promise 的状态不是 fulfilled 之前
2.2.2.3 onRejected 只能被调用一次
  • 2.2.4 onFulfilled 和 onRejected 应该是微任务
  • 2.2.5 onFulfilled 和 onRejected 必须作为函数被调用
  • 2.2.6 then 方法可能被多次调用
2.2.6.1 如果 promise 变成了 fulfilled 状态, 所有的 onFulfilled 回调都需要按照 then 的顺序执行
2.2.6.2 如果 promise 变成了 rejected 状态, 所有的 onRejected 回调都需要按照 then 的顺序执行
  • 2.2.7 then 必须返回一个promise
promise2 = promise1.then(onFulfilled, onRejected);
2.2.7.1 onFulfilled 或 onRejected 执行的结果为x, 调用[[Resolve]](promise2, x)
2.2.7.2 如果 onFulfilled 或 onRejected 执行时抛出异常e,promise2 需要被 rejected
2.2.7.3 如果 onFulfilled 不是一个函数, promise2 以 promise1 的值 fulfilled
2.2.7.4 如果 onRejected 不是一个函数,promise2 以 promise1 的reason rejected

2.3 [[Resolve]](promise, x) 方法

  • 2.3.1 如果 promise 和 x 相等,那么 reject promise with a TypeError
  • 2.3.2 如果 x 是一个 promise
2.3.2.1 如果 x 是 pending 状态,那么 promise 必须要在pending,直到 x 变成 fulfilled or rejected
2.3.2.2 如果 x 被 fulfilled, fulfill promise with the same value
2.3.2.3 如果 x 被 rejected, reject promise with the same reason
  • 2.3.3 如果 x 是一个 object 或者是一个 function
2.3.3.1  let then = x.then
2.3.3.2 如果 x.then 的结果抛出错误 e ,那么 reject promise with e as the reason
2.3.3.3 如果 then 是一个函数,then.call(x, resolvePromise, rejectPromise)
            2.3.3.3.1 resolvePrmoise 的入参是y, 执行[[Resolve]](promise, y)
            2.3.3.3.2 rejectPromise 的入参是 r,reject promise with r
            2.3.3.3.3 如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略
            2.3.3.3.4 如果调用 then 抛出异常e
                        2.3.3.3.4.1 如果 resolvePromise 或rejectPromise 已经被调用,那么忽略
                        2.3.3.3.4.2 否则,reject promise with e as the reason
2.3.3.4 如果 then 不是一个 function, fulfill promise with x
  • 2.3.4 如果 x 不是一个 object 或者是一个 function,fulfill promise with x

总结

以上就是Promises/A+的核心标准说明的翻译版,如果读者想要更加详细的了解Promise标准的内容请戳Promises/A+或者上面的传送点。下面笔者会根据Promises/A+的核心标准实现多种自己的Promise。

传送点:

1.Promise与异步编程(二):单撸简版Promise

喜欢的,还望给小的一波素质三连(点赞评论+关注),我会继续努力的!持续更新中..