写点什么

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

作者:Brave
  • 2021 年 11 月 16 日
  • 本文字数:1696 字

    阅读完需:约 6 分钟

一,前言


上一篇,完善了 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

用户头像

Brave

关注

还未添加个人签名 2018.12.13 加入

还未添加个人简介

评论

发布
暂无评论
【Promise 源码学习】第九篇 - Promise.resolve 和 Promise.reject 的实现