对Promise一直一知半解。今天看到之前写的笔记。突然理解了,记录一下~
` class Promise 代码
constructor(excutor){
//实例化后接受promise括号内处理方法
//调用处理方法,传入resolve和reject方法 使promise内部可以调用
excutor(this.resolve,this.reject)
}
//记录状态值
status = PENDING
//存储成功消息
valuea = undefined
//存储失败消息
reason = undefined
//存储成功回调
successCallBack=[]
//存储失败回调
failCallBack=[]
resolve(){
if(this.status!==PENDING)return;
//状态
this.status = FULFILLED;
//回调值
this.valuea = value;
//如果回调存在 调用
// this.successCallback = this.successCallback(value);
//多次调用 匿名函数调用
while(this.successCallback.length) this.successCallback.shift()()
}
reject(){
//与resolve同理
}
//new Promsise().then 链式调用promise上的函数
//实例化后立即执行了then方法 接受then传入参数
then(successCallback,failCallBack){
//判断当前回调是可执行数组还是值
let promise2 = new Promise((resolve,reject)=>{
//判断当前状态 成功 失败 等待
//如果是成功的话
if(this.status == FULFILLED){
//调用传入回调处理函数 传入成功值
let x = successCallback(this.valuea);
//判断x是promise还是普通值
//如果是函数值 x.then 继续执行
//如果是普通值 resolve(value)
resolvePromise(promise2,x,resolve,reject);
}else if(this.status == REJECTED){
}else{
//如果是等待,将成功回调和失败回调都存储起来
this.successCallback.push(()=>{
//异步 setTimeout
//成功回调
let x = successCallback(this.valuea);
//判断值是promise还是普通值
resolvePromise(promise2,x,resolve,reject);
};
this.failCallback.push(()=>{
//异步 setTimeout
//成功回调
let r = failCallback(this.reason);
//判断值是promise还是普通值
resolvePromise(promise2,x,resolve,reject);
}
}
})
}
//判断执行后参数是普通值还是promise
resolvePromise 函数 传入参数 promise2,x,resolve,reject
if(promise2 === x){
reject(new TypeError('Chaining cycle detected for promise #'))
}
if(x instanceof MyPromise){
//promise 对象
//x.then(value=>resolve(value),reason=>reject(reson))
x.then(resolve,reject)
}else{
//普通
resolve(x)
}
`