export default class Promise {
constructor (handle) {
// 初始值 默认的状态
this['[[PromiseState]]'] = 'pending';
this['[[PromiseResult]]'] = 'undefined';
//给then定义数组
this.resolveFnQueue = [];
this.rejectFnQueue = [];
//执行下面的两个函数,并且改变this的状态
handle (this._resolve.bind(this), this._reject.bind(this))
}
_resolve(val){
//1.改变状态 2,改变value
this ['[[PromiseState]]'] = 'fulfilled'
this ['[[PromiseResult]]'] = val
//模拟微任务
// let run = () => {
// let cb;
// //删除数组中第一个数组
// while (cb = this.resolveFnQueue.shift()) {
// cb (val)
// }
// }
// let mo = new MutationObserver(run);
// let box = document.querySelector(".box");
// mo.observe(box,{
// attributes:true
// })
// box.setAttribute("kkb","kkb")
setTimeout (()=>{
// this.resolveFn(val)
let cb;
while(cb = this.resolveFnQueue.shift()){
cb(val);
}
})
}
_reject(err){
//改变状态
this ['[[PromiseState]]'] = "rejected";
this ['[[PromiseResult]]'] = err;
// let run = () => {
// let cb;
// while(cb = this.rejectFnQueue.shift()){
// cb(ell)
// }
// }
// let mo = new MutationObserver(run);
// let box = document.querySelector(".box");
// mo.observe(box,{
// attributes:true
// })
// box.setAttribute("kkb","kkb");
setTimeout(()=>{
// this.rejectFn(err)
let cb;
while(cb = this.rejectFnQueue.shift()){
cb(err);
}
})
}
then(onResolved, onRejected) {
// 创建一个新的promise对象 并且返回
return new Promise ((resolve,reject)=>{
//封装函数
let onResolvedFn = (val)=>{
let res = onRejected && onResolved(val);
//判断执行结果是不是promise对象
if(res instanceof Promise){
//如果是promise就返回resolve
res.then(resolve);
}else{
//否则就返回res
resolve(res)
}
}
let onRejectedFn = (err)=>{
onResolved && onRejected(err);
reject(err);
}
//执行把onRejectedFn和onResolvedFn里的数添加到 数组里面
this.resolveFnQueue.push(onRejectedFn);
this.rejectFnQueue.push(onResolvedFn)
})
}
static resolve(val){
return new KPromise(resolve=>{
resolve(val);
})
}
static reject(err){
return new KPromise((undefined,reject)=>{
reject(err);
})
}
static race(list){
return new KPromise((resolve,reject)=>{
list.forEach(item=>{
item.then(res=>{
resolve(res);
},err=>{
reject(err)
})
})
})
}
static all(list){
return new KPromise(resolve=>{
let resArr = [];
let num = 0;
list.forEach(item=>{
item.then(res=>{
num++;
resArr.push(res);
if(num===list.length){
resolve(resArr);
}
})
})
})
}
static allSettled(list){
let resArr = new Array(list.length);
let num = 0
return new KPromise(resolve=>{
list.forEach((item,key)=>{
let obj = {};
item.then(res=>{
obj['status'] = this['[[PromiseState]]'];
obj.value = res;
resArr[key] = obj;
num++
if(num===list.length){
resolve(resArr);
}
},err=>{
obj['status'] = this['[[PromiseState]]'];
obj.reson = err;
resArr[key] = obj;
num++
if(num===list.length){
resolve(resArr);
}
})
})
});
}
finally(cb){
this.then(cb,cb);
}
catch(cb){
this.then(undefined,err=>{
cb && cb(err);
})
}
}
Promise的原理
于 2021-02-04 13:04:48 首次发布