手写一个promise用法_手写一个Promise

首先要确定Promise的几个特点

Promise就是一个类,在执行这个类的时候需要传递一个执行器进去,执行器会立即执行

Promise有三个状态,分别为 成功 fulfilled 失败 rejected 等待pending (pending=>fulfilled pending=>rejected) 一旦状态确定就不可更改

resolve 和reject函数是用来更改状态的 resolve:fulfilled,reject:rejected

then方法内部做的事情就是判断状态,如果状态是成功,就调用成功回调,如果是失败就调用失败回调,then方法被定义在原型对象里

then成功回调有一个返回值,表示调用成功之后的值,失败回调也有一个返回值,表示失败的原因

同一个promise下的then可以调用多次的

then方法是可以被链式调用的,后面then方法的回调函数拿到的值是上一个then方法的回调函数的返回值

以上就是Promise的主要部分,下面我们就根据这些特点来实现我们自己的promise

首先定义出一个类,和三个常量状态(方便复用)和类里的一些常用状态

const PENDING = 'pending';//等待

const FUFILLED = 'fufilled';//成功

const REJECTED = 'rejected';//失败

class MyPromise{

constructor(executor){

try{

executor(this.resolve,this.reject);

}catch(err){

this.reject(err);

}

}

//状态

status=PENDING;

//成功之后的值

value=null;

//失败之后的值

reason=null;

//成功之后then的回调,可能对当前这个promise绑定多次then回调所以使用数组储存

successCallback=[];

failCallback=[];//同成功一样

resolve=(value)=>{

//如果状态不是等待,证明多次调用了,退出

if(this.status!==PENDING)return;

this.status = FUFILLED;//改变状态

this.value=value;//保存成功的值

//当前成功状态修改完成之后,查看是否通过then函数绑定了成功回调,如果有就调用

while(this.successCallback.length)this.successCallback.shift()()

}

reject=(reason)=>{

//如果状态不是等待,证明多次调用了,退出

if(this.status!==PENDING)return;

this.status = REJECTED;//改变状态

this.reason=reason;//保存成功的值

while(this.failCallback.length)this.successCallback.shift()()

}

then(successCallback,failCallback){

let promsie2=new MyPromsie((resolve,reject)=>{

if(this.status===FUFILLED){

let x=successCallback(this.value);

resolve(x);

}else if(this.status===REJECTED){

let x=failCallback(this.reason);

resolve(x);

}else{

this.successCallback.push(successCallback)

this.failCallback.push(failCallback)

}

})

return promise2;

}

}

executor是初始化这个MyPromise这个类传递进去的执行器,这个执行器会立即执行,executor接收俩参数this.resolve,this.reject,这俩是两个函数,一个是成功执行的回调,一个失败执行的回调。(用箭头函数绑定下this,保证调用的时候上下文不丢)

未完待续

你可能感兴趣的:(手写一个promise用法)