手撕Promise系列九

108 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

题外话

最近一直在研究手撕Promise,昨天晚上做梦都在写Promise实现,写到then方法实现的时候,怎么也达不到返回值,然后急哭了,就很离谱......

前情回顾

说回正题,上一篇中我们实现了Promise.resolve()、Promise.finnally(),其实到这里promise的一些方法九已经实现的差不多了,目前还有有个Promise.race()还没有实现,今天就来实现一下Promise.race()方法

正文

Promise.race()

老规矩,再实现一个方法之前我们首先需要知道这个方法都有哪些特性。

Promise.race实际上了Promise.all有点相像,不过他俩算是全完相反的两个方法。Promise.all是只要有一个promise状态是rejected,那么返回的结果就是失败的,只有全部状态都是成功的,返回的结果才能是成功。而Promise.race则是只要有一个promise执行完毕,就直接调用resolve并终止运行。

那么我们就来实现一下吧

  1. Promise.race也是接收一个数组作为参数
  2. 同样,数组里面的参数可以是普通值,也可以是promise对象
  3. 最终返回的结果是一个promise对象,是可以通过then方法链式调用的。
//1. 接收一个数组作为参数
Promise.Myrace = function(array) {
  //2. 返回一个promise对象
  return new Promise((resolve, reject) => {
      //3. 对数组边界进行判断
      if (!array.length) return
      //4. 循环数组
      for (let i = 0; i < array.length; i++) {
          //4. 对所有参数都执行promise.resolve转换为promise对象
          Promise.resolve(array[i]).then(resp => {
              //5. 只要有一个promise执行完,就返回结果
              return resolve(resp)
          }, err => {
              return reject(err)
          })
      }
  })
}

关于promise的手撕方法到这里就结束了,因为再这几期的手撕promise系列里面,我们总常见new这个关键字,接下来我及说说我们再执行new一个函数的时候内部都做了什么,自己怎么实现一个new

实现一个new

老规矩,先知道执行new关键字的时候干了什么,接着再实现代码

  1. 先创建了一个新对象
  2. 将构造函数的显示原型绑定赋值给空对象的隐式原型
  3. 将this绑定到新的空对象上
  4. 如果构造函数没有返回非空对象,那么就返回空对象
function _new(constructor, ...args) {
    let obj = {}
    obj.__proto__ = constuctor.prototype
    let result = constructor.call(obj, ...args)
    return result instanceof Object ? result : obj
}

结束

今天是手撕Promise系列的完结篇,下周个更新什么,我也没想好,但是写不动了,下周见吧