实现 Promise.resolve

实现 resolve 静态方法有三个要点:

  • 传参为一个 Promise, 则直接返回它。
  • 传参为一个 thenable 对象,返回的 Promise 会跟随这个对象,采用它的最终状态作为自己的状态
  • 其他情况,直接返回以该值为成功状态的promise对象。

具体实现如下:

  1. Promise.resolve = (param) => {
  2. if(param instanceof Promise) return param;
  3. return new Promise((resolve, reject) => {
  4. if(param && param.then && typeof param.then === 'function') {
  5. // param 状态变为成功会调用resolve,将新 Promise 的状态变为成功,反之亦然
  6. param.then(resolve, reject);
  7. }else {
  8. resolve(param);
  9. }
  10. })
  11. }

实现 Promise.reject

Promise.reject 中传入的参数会作为一个 reason 原封不动地往下传, 实现如下:

  1. Promise.reject = function (reason) {
  2. return new Promise((resolve, reject) => {
  3. reject(reason);
  4. });
  5. }

实现 Promise.prototype.finally

无论当前 Promise 是成功还是失败,调用finally之后都会执行 finally 中传入的函数,并且将值原封不动的往下传。

  1. Promise.prototype.finally = function(callback) {
  2. this.then(value => {
  3. return Promise.resolve(callback()).then(() => {
  4. return value;
  5. })
  6. }, error => {
  7. return Promise.resolve(callback()).then(() => {
  8. throw error;
  9. })
  10. })
  11. }

参考文章

三元博客