手撕Promise系列八

104 阅读2分钟

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

题外话

本来就只打算写一个手撕Promise系列,我发现很多ES6之后新增的方法和属性,很多人都不是很清楚,那么首席Promise系列完结之后我就逐步开始更新一些新方法:比如Reflect,Proxy等等。

前情回顾

上一篇中我们使用了两种方式(一种使用了Promise.resolve(),一种是自行封装的方法)对Promise.all()进行的模拟实现,实现Promise.all()核心理念就是三点:

  1. 接收一个数组,返回一个promise对象,最终结果是一个数组
  2. 针对数组参数一定是都取到结果才回返回最终的结果
  3. 只有promise对象的状态都是true,最终结果才是true;只有有一个promise对象状态是false,那么最终结果也是false。

关于Promise.all()的复习就告一段落,如果没想起来或者没有理解透彻的,可以再返回去复习一遍

正文

今天我们来认识和手撕Promise.resolve()

Promise.resolve()

  1. 判断传入的参数是否是promise对象,如果是promise对象就直接返回该参数
  2. 如果不是promise对象,就将立即执行new Promise,再判断该参数是否已经有返回值,如果有就是用then方法获取返回值,如果没有就使用resolve进行调用
//1.定义自己的resolve方法
Promise.Myresolve = params => {
    //2. 判断参数是否是promise对象,如果是promise对象就直接返回这个参数
    if (param instanceof Promise) return param
    //3. 如果是非promise对象,我们需要将这个参数变成一个promise对象再返回
    return new Promise((resolve, reject) => {
        //4. 判断这个参数是否有返回值,如果有返回值就需要调用then方法获取返回值
        if (param && param.then && param.then === 'function') {
            param.then(resolve, reject)
        } else {
            //5. 如果这个参数没有返回值就直接调用resolve
            resolve(param)
        }
    })
}

Promise.prototype.finally()

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

//Promise.finally接收一个函数作为参数
Promise.Myfinnally = function(callback) {
    //1. 调用传入的函数的then方法
    this.then(resp => {
        return Promise.resolve(callback()).then(resp => {
            return resp
        })
    }, error => {
        return Promise.resolve(callback()).then(() => {
            throw error
        })
    })
}

结束

这一章里面我么介绍了Promise.all()和Promise.finnally()方法,下一篇我们将接收Promise.race()方法。