ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

写给自己看的Promise

2020-11-11 15:32:32  阅读:218  来源: 互联网

标签:MyPromise resolve 函数 状态 自己 value 写给 Promise reject


static PENDING = "pending";//准备状态

static FULFILLED = "fulfilled";//解决状态

static REJECTED = "rejected";//拒绝状态

 

1.初始化状态、值、then中没 有处理的函数数组

2.将resolve和reject函数传递 出去

 

 

constructor(executor) {

this.status = MyPromise.PENDING;//初始化状态

this.value = null;//初始化值

this.callbacks = [];//待处理的函数

 

try {

// 在执行(resolve,reject)=> {} 如果发送报错,则把状态改为拒绝状态,并且把结果返回出去

// 参数这边为是实参 函数执行体为那边

executor(this.resolve.bind(this), this.reject.bind(this));//执行构造时传入的回调函数

} catch (error) {

this.reject(error)

}

}

 

1.判断是否为准备状态

2.是—>改变状态和值、以及异步轮询 then     中没有执行完成的函数

 

 

 

resolve函数 reject函数类似

//发起解决

resolve(value) {

//先判断状态 为避免执行完resolve 后又执行reject导致重复改变状态

if (this.status == MyPromise.PENDING) {

this.status = MyPromise.FULFILLED;//改变状态

this.value = value;//改变值

 

//resolve和reject执行被放到setTimeout中,执行在then还没有执行的函数

/*将then中没有执行的代码放到setTimeout中异步执行为了避免与resolve有同级的同步代码

例如

setTimeout(() => {

resolve("后盾人");

console.log("大叔视频");

});*/

setTimeout(() => {

this.callbacks.map(callback => {

callback.onFulfilled(this.value);

})

}, 0)

}

}

 

 

then函数

1. 判断onFuilled/onRejected是否为函数

//执行重置函数将this.value传入并返回给下一个promise对象

if (typeof onFulfilled != "function") {

onFulfilled = value => value;

}

 

if (typeof onRejected != "function") {

onRejected = value => value;

}

2. 返回一个新MyPromise

该MyPromise的创建需要拿上一个MyPromise在onFuilled/onRejected完处理的数据进行初始化

 

 

 

  1. 没有处理的状态

if (this.status == MyPromise.PENDING) {

this.callbacks.push({

onFulfilled: value => {

this.parse(mypromise, onFulfilled(value), resolve, reject);

},

onRejected: value => {

this.parse(mypromise, onRejected(value), resolve, reject);

}

})

}

 

  1. 成功状态

if (this.status == MyPromise.FULFILLED) {

setTimeout(() => {

this.parse(mypromise, onFulfilled(this.value), resolve, reject);

})

}

 

  1. 拒绝状态

if (this.status == MyPromise.REJECTED) {

setTimeout(() => {

this.parse(mypromise, onRejected(this.value), resolve, reject);

})

 

}

 

parse函数

parse(mypromise, result, resolve, reject) {

//不能返回相同的mypromise

if (mypromise == result) {

throw new TypeError("Chaining cycle detected");

}

try {

//如果是返回值是一个MyPromise对象,需要执行多一次then

if (result instanceof MyPromise) {

result.then(

value => {

//初始化新创建的MyPromise

resolve(value);

},

reason => {

//初始化新创建的MyPromise

reject(reason);

}

)

} else {

//新创建的myPromise对象默认执行resolve方法

resolve(result);

}

} catch (error) {

reject(error)

}

}

 

标签:MyPromise,resolve,函数,状态,自己,value,写给,Promise,reject
来源: https://www.cnblogs.com/jushoujunbao/p/13958947.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有