极简版Promise满足使用方法。生成实例对象的方式:newMyPromise()直接通过类调用静态方法:MyPromise.resolve()。目前静态方法只支持resolve&reject,个人测试。OK,欢迎指教,互相学习,github链接,欢迎star。附上手写Promise使用构造函数的方法,github链接。classMyPromise{constructor(fn){//定义Promise的三种状态this.states={PENDING:'PENDING',RESOLVED:'RESOLVED',REJECTED:'REJECTED'}//定义传递给then的值this.value=null//定义当前Promise运行状态this.state=this.states.PENDING//定义Promise失败状态回调函数集this.resolvedCallBacks=[]//定义Promise成功状态回调函数集this.rejectedCallBacks=[]//对于静态方法definethatMyPromise.that=thistry{//执行newMyPromise()传入的方法fn(MyPromise.resolve,MyPromise.reject)}catch(error){MyPromise.reject(this.value)}}//静态解析方法,无法访问MyPromise实例;//支持类MyPromise访问,例如:MyPromise.resolve('success').then(e=>e)staticresolve(value){//由于静态方法内部的this指向类而不是实例,所以使用下面方法访问实例对象constthat=MyPromise.that//判断是否是MyPromise实例accessresolveconstf=thatinstanceofMyPromise//MyPromise实例对象访问resolveif(f&&that.state==that.states.PENDING){that.state=that.states.RESOLVEDthat.value=valuethat.resolvedCallBacks.map(cb=>(that.value=cb(that.value)))}//MyPromise类访问resolveif(!f){constobj=newMyPromise()returnObject.assign(obj,{state:obj.states.RESOLVED,value})}}//静态拒绝方法,MyPromise实例不可访问;//支持类MyPromise访问,例如:MyPromise.reject('fail').then(e=>e)staticreject(value){constthat=MyPromise.thatconstf=thatinstanceofMyPromiseif(f&&that.state==that.states.PENDING){that.state=that.states.REJECTEDthat.value=valuethat.rejectedCallBacks.map(cb=>(that.value=cb(that.value)))}if(!f){constobj=newMyPromise()returnObject.assign(obj,{state:obj.states.REJECTED,value})}}//确定then方法定义在MyPromise原型上then(onFulfilled,onRejected){const{PENDING,RESOLVED,REJECTED}=this.statesconstf=typeofonFulfilled=="function"?onFulfilled:c=>c;constr=typeofonRejected==“函数”?onRejected:c=>{抛出c;};switch(this.state){casePENDING://添加回调到'PENDING'状态的回调函数集合this.resolvedCallBacks.push(f)this.rejectedCallBacks.push(r)中断;caseRESOLVED://将回调函数的返回值赋给实例的值,满足链式调用then方法时传值的需要this.value=f(this.value)break;caseREJECTED://同上this.value=r(this.value)break;默认值:中断;}//满足链式调用then返回MyPromise实例对象returnthis}}MyPromise.resolve('success').then((e)=>{console.log(e);returne+1}).then(res=>{console.log(res);})newMyPromise(resolve=>{setTimeout(()=>{resolve(1);},2000);}).then(res1=>{console.log(res1);return2;}).then(res2=>console.log(res2));
