Promise的初始状态是pending;需要对resolve和reject绑定this,确保reslove和reject的this永远指向当前的new Promise实例,防止随着执行环境的改变而改变。
一旦状态从初始状态变为fulfilled或者rejected,那么当前的实例状态就不可再变了
class _Promise(executor){constructor(){//初始化值this.initValue();this.initBind();}initValue(){this.PromiseResult=null;this.PromiseState='pending';}initBind(){//初始化solvesolve.bind(this);jectsolve.bind(this);}resolve(value){//state不可变if(this.PromiseState!=='pending')return;//如果执行resolve,状态变为fulfilledthis.PromiseState='fulfilled';//结果赋给PromiseResultthis.PromiseResult=value;}reject(reason){//state不可变if(this.PromiseState!=='pending')return;//如果执行reject,状态变为rejectedthis.PromiseState='rejected';this.PromiseResult=reason;}
}
Promise中有throw,就相当于执行了reject,在构造方法中需要新增try catch部分
constructor(executor){this.initValue();this.initBind();try{//执行传入函数ject);}catch(e){ject(e);}}
then(onFulfilled, onRejected) {// 接收两个回调 onFulfilled, onRejected// 参数校验,确保⼀定是函数onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val;onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason };if (this.PromiseState === 'fulfilled') {// 如果当前为成功状态,执⾏第⼀个回调onFulfilled(this.PromiseResult)} else if (this.PromiseState === 'rejected') {// 如果当前为失败状态,执⾏第⼆哥回调onRejected(this.PromiseResult)}}
思路 先将then里的回调保存起来,等到定时器结束,执行了resolve和reject后,再去判断状态,并且判断要去执行保存的哪一个回调。
class _Promise {// 构造⽅法constructor(executor) {// 初始化值this.initValue();// 初始化this指向this.initBind();try {// 执⾏传进来的函数solve, ject)} catch (e) {// 捕捉到错误直接执⾏ject(e)}}initBind() {// 初始化solve = solve.bind(ject = ject.bind(this)}initValue() {// 初始化值this.PromiseResult = null // 终值this.PromiseState = 'pending' // 状态FulfilledCallbacks = [] // 保存成功回调RejectedCallbacks = [] // 保存失败回调}resolve(value) {// state是不可变的if (this.PromiseState !== 'pending') return// 如果执⾏resolve,状态变为fulfilledthis.PromiseState = 'fulfilled'// 终值为传进来的值this.PromiseResult = value// 执⾏保存的成功回调while (FulfilledCallbacks.length) {FulfilledCallbacks.shift()(this.PromiseResult)}}reject(reason) {// state是不可变的if (this.PromiseState !== 'pending') return// 如果执⾏reject,状态变为rejectedthis.PromiseState = 'rejected'// 终值为传进来的reasonthis.PromiseResult = reason// 执⾏保存的失败回调while (RejectedCallbacks.length) {RejectedCallbacks.shift()(this.PromiseResult)}}then(onFulfilled, onRejected) {// 接收两个回调 onFulfilled, onRejected// 参数校验,确保⼀定是函数onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val=> val;onRejected = typeof onRejected === 'function' ? onRejected : reason=> { throw reason };if (this.PromiseState === 'fulfilled') {// 如果当前为成功状态,执⾏第⼀个回调onFulfilled(this.PromiseResult)} else if (this.PromiseState === 'rejected') {// 如果当前为失败状态,执⾏第⼆哥回调onRejected(this.PromiseResult)} else if (this.PromiseState === 'pending') {// 如果状态为待定状态,暂时保存两个回调FulfilledCallbacks.push(onFulfilled.bind(this))RejectedCallbacks.push(onRejected.bind(this))}}
}
static all(promises){const result=[];let count=0;return new _Promise((resolve,reject)=>{const addData=(index,value)=>{result[index]=value;count++;if(count==promises.length)resolve(result);}promise.forEach((promise,index)=>{if(promise instanceof _Promise){promise.then(res=>{addData(index,res)},err=>reject(err));}else {addData(index,promise)}})})
}
static race(promises) {return new _Promise((resolve, reject) => {promises.forEach(promise => {if (promise instanceof _Promise) {promise.then(res => {resolve(res)}, err => {reject(err)})} else {resolve(promise)}})})
}
static any(promises){return new _Promise((resolve,reject)=>{let count=0;promises.forEach((promise)=>{promise.then(val=>{resolve(val);},err=>{count++;if(count===promises.length){reject(new AggregateError('All promises were rejected')) }})})})
}
本文发布于:2024-02-01 00:33:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170671881632530.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |