【手写 Promise 源码】第九篇 - Promise.resolve 和 Promise.reject 的实现

600 阅读3分钟

一,前言

上一篇,完善了 Promise 源码并通过 promise-aplus-tests 测试,主要涉及以下几个点:

  • 完善了 Promise 源码:支持两种嵌套 promise 的情况;
  • 分析了 Promise 的执行过程;
  • 创建延迟对象并通过 promise-aplus-tests 测试;

本篇,继续实现 Promise 的两个静态 API(类方法) Promise.resolvePromise.reject


二,前文回顾

在前面几篇,根据 Promise A+ 规范手写了 Promise 源码并通过了 promise-aplus-tests 测试;

在第二篇中,已经对 Promise 静态 API 的使用进行了简单介绍;

  • ** 或**:
  • 静态 API 或类方法:不需要 new 出实例就可以使用的静态方法;

Promise 有 3 个实例 API(原型方法):new Promise 实例才能使用;

  • then
  • catch
  • finally

Promise 有 4 个静态 API(类方法):无需实例化,可直接使用;

  • resolve
  • reject
  • all
  • race

接下来,实现两个简单的 Promise 静态 API:Promise.resolvePromise.reject


三,Promise.resolve 的实现

1,测试原生的 Promise.resolve

Promise.resolve 中有可能处理同步逻辑,也有可能处理异步逻辑:

  • Promise.resolve执行同步操作:
Promise.resolve(100).then((data) => {
  console.log(data)
}) 

// 执行结果:100
  • Promise.resolve执行异步操作:
Promise.resolve(new Promise((resolve, reject)=>{
  setTimeout(() => {
    resolve(100)
  }, 1000);
})).then((data) => {
  console.log(data)
})

// 执行结果:1 秒后返回 100

Promise 的 resolve 中是一个 promise 对象时,会等待 promise 异步操作执行完毕;

2,原理分析

从执行结果看,Promise.resolve返回的就是一个成功的 promise,等价于:

// 同步操作
new Promise((resolve, reject)=>{
  resolve(100)
}).then((data) => {
  console.log(data)
})

// 执行结果:100
// 异步操作
new Promise((resolve, reject)=>{
  resolve(new Promise((resolve, reject)=>{
      setTimeout(() => {
        resolve(200)
      }, 1000);
    })
  )
}).then((data) => {
  console.log(data)
})

// 执行结果:1 秒后返回 100

3,测试手写的Promise.resolve

使用相同代码测试,由于尚未实现静态方法Promise.resolve,所以会报错:

TypeError:Promise.resolve is not a function

4,实现 Promise.resolve

在 Promise 类中,添加静态方法 Promise.resolve();

  // 静态方法 Promise.resolve()
  static resolve(value){
    return new Promise((resolve, reject)=>{
      resolve(value)
    })
  }

通过静态方法 Promise.resolve,返回了一个成功的 promise 对象;


四,Promise.reject 的实现

与 Promise.resolve() 相似,Promise.reject 会创建一个失败的 promise;

1,测试原生的 Promise.reject

// 测试源生的Promise.reject()
Promise.reject(new Promise((resolve, reject)=>{
  setTimeout(() => {
    resolve(200)
  }, 1000);
})).then((data) => {
  console.log(data)
},err=>{
  console.log(err, 'err')
})

// 执行结果:直接返回 Promise { <pending> } err

2,原理分析

Promise 的 reject 中是一个 promise 对象时,就不会等待 promsie 异步操作执行完毕,会直接返回;

由于 Promise.reject 会创建一个失败的 promise,promise 一旦失败后就会直接返回;

所以,不会等到 1 秒后再返回,而是直接返回了 PENDING 态的 promise;

3,测试手写的 Promise.reject

使用相同代码测试,由于尚未实现静态方法Promise.reject,所以会报错:

TypeError:Promise.reject is not a function

4,实现 Promise.reject

在 Promise 类中,添加静态方法 Promise.reject();

  // 静态方法 Promise.reject()
  static reject(value){
    return new Promise((resolve, reject)=>{
      reject(value)
    })
  }

五,结尾

本篇,主要实现了 Promise 的两个静态 API(类方法):Promise.resolvePromise.reject

  • Promise.resolve创建并返回一个成功的 promise;
  • Promise.reject创建并返回一个失败的 promise;
  • Promise.resolve 会等待异步操作完成;Promise.reject 失败会直接返回;

下一篇,继续实现 Promise 两个实例 API(原型方法):Promise.prototype.catchPromise.prototype.finally


维护日志

  • 20211103
    • 添加 Promise.reject 部分代码和描述;
    • 修改结尾部分和摘要;