快速掌握手写Promise.resolve以及Promise.reject

222 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

前言

本篇将讲解Promise.resolve以及Promise.reject的细则以及实现,希望通过阅读这篇文章能让你完全掌握。

阅读这篇文章,需要你掌握的知识👇

  • Promise基本知识

其中Promise基础知识如果不了解或有遗忘的同学可以参考我这篇文章:《简单明了的Promise基本知识点》

什么是Promise.resolve

Promise.resolve作为Promise类向外部暴露的apiPromise.resolve(value) 将给定的一个值转为Promise对象。其中对于参数value的类型不同,会有以下几种处理方式:

  • 如果value是一个promise ,那么将返回这个 promise
  • 如果valuethenable(即带有"then"方法的对象),在返回的Promise中执行valuethen方法。
  • 否则返回的promise将以value完成,即以此值执行resolve()方法。

实现Promise.resolve

function myResolve(value){
       if (value instanceof Promise){
           //如果`value`是一个` promise` ,那么将返回这个 `promise` 
            return value
        }else if(value instanceof Object && 'then' in value){
            return new Promise((resolve,reject)=>{
                //如果`value`是`thenable`(即带有`"then" `方法的对象),在返回的Promise中执行`value`的`then`方法。
                value.then(resolve,reject)
            })
        }else{
            //否则返回的promise将以`value`完成,即以此值执行`resolve()`方法。
            return new Promise((resolve)=>{
                resolve(value)
            })
        }
}

测试代码

const promise1 = myResolve(123);
​
promise1.then((value) => {
  console.log(value);
  // expected output: 123
});
​
// Resolve一个thenable对象
var p1 = myResolve({
    then: function (onFulfill) {
        onFulfill("Resolving");
    }
});
console.log(p1 instanceof Promise) // true, 这是一个Promise对象setTimeout(() => {
    console.log('p1 :>> ', p1);
}, 1000);
​
p1.then(function (v) {
    console.log(v); // 输出"fulfilled!"
}, function (e) {
    // 不会被调用
});
​
// Thenable在callback之前抛出异常
// myPromise rejects
var thenable = {
    then: function (resolve) {
        throw new TypeError("Throwing");
        resolve("Resolving");
    }
};
​
var p2 = myResolve(thenable);
p2.then(function (v) {
    // 不会被调用
}, function (e) {
    console.log(e); // TypeError: Throwing
});
​

控制台结果:

true
123
Resolving
TypeError: Throwing
p1 :>>  Promise { 'Resolving' }

如果你的输出结果和以上一致,就代表测试通过了🤩

什么是Promise.reject

Promise.reject作为Promise类向外部暴露的api

Promise.reject接收一个参数,并将这个参数作为拒绝执行的原因执行,即:reject(value)

实现Promise.reject

function myReject(value){
        return new Promise((resolve,reject)=>{
            reject(value)
        })
}

测试代码

let promise1 = myReject(new Error('no why'))
let promise2 = myReject(2)

控制台结果👇

Promise {
  <rejected> Error: no why
}
Promise { <rejected> 2 }
​

如果你的输出结果和以上一致,就代表测试通过了🤩

尾声

这俩个api的实现较为简单,我就合着一篇文章一起讲解了。越写越发现实现Promise系列的难点是去记这么多规则了,希望同学们牢记规则。