class KPromise {
constructor(handle) {
this['[[PromiseState]]'] = 'pending';
this['[[PromiseResult]]'] = undefined;
this.resolveQueue = [];
this.rejectQueue = [];
handle(this.#resolve.bind(this), this.#reject.bind(this));
}
#resolve(val) {
this['[[PromiseState]]'] = 'fulfilled';
this['[[PromiseResult]]'] = val;
const run = () => {
// this.resolveFn(val);
let cb;
while (cb = this.resolveQueue.shift()) {
cb && cb(val);
}
}
// setTimeout(run);
let ob = new MutationObserver(run);
ob.observe(document.body, {
attributes: true
})
document.body.setAttribute("kkb", "value");
}
#reject(err) {
this['[[PromiseState]]'] = 'rejected';
this['[[PromiseResult]]'] = err;
// this.rejectFn(err);
const run = () => {
// this.rejectFn(err);
let cb;
while (cb = this.rejectQueue.shift()) {
cb && cb(err);
}
}
// setTimeout(run);
let ob = new MutationObserver(run);
ob.observe(document.body, {
attributes: true
})
document.body.setAttribute("kkb", "value");
}
then(onResolved, onRejected) {
// if(this['[[PromiseState]]']==='fulfilled'){
// onResolved(this['[[PromiseResult]]'])
// }
// 保存 onResolved、onRejected;
// this.resolveFn = onResolved;
// this.rejectFn = onRejected;
return new KPromise((reslove, reject) => {
// onResolved();
let resolveFn = (val) => {
let res = onResolved && onResolved(val);
if(res instanceof KPromise){
// 返还的一个promise对象,取出值
// res.then(result=>{
// reslove(result);
// })
res.then(reslove);
}else{
// 普通值
reslove(res);
}
}
this.resolveQueue.push(resolveFn);
// this.rejectQueue.push(onRejected);
let rejectFn = (err) => {
onRejected && onRejected(err);
reject(err);
}
this.rejectQueue.push(rejectFn);
})
}
static resolve(val){
return new KPromise(resolve=>{
resolve(val);
})
}
static reject(err){
return new KPromise((resolve,reject)=>{
reject(err);
})
}
static race(lists){
return new KPromise((resolve,reject)=>{
lists.forEach(item=>{
item.then(res=>{
resolve(res);
},err=>{
reject(err);
})
})
})
}
static allSettled(lists){
let resArr = new Array(lists.length);
let num = 0
return new KPromise(resolve=>{
lists.forEach((item,key)=>{
let obj = {};
item.then(res=>{
obj['status'] = "fulfilled";
obj['value'] = res;
resArr[key] = obj;
num++;
if(num>=lists.length){
resolve(resArr);
}
},err=>{
obj['status'] = "rejected";
obj['reason'] = err;
resArr[key] = obj;
num++;
if(num>=lists.length){
resolve(resArr);
}
})
})
})
}
static all(lists){
let resArr = [];
let num = 0;
return new KPromise(resolve=>{
lists.forEach(item=>{
item.then(res=>{
num++;
resArr.push(res);
if(resArr.length===lists.length){
resolve(resArr);
}
})
})
})
}
catch(cb){
this.then(undefined,cb);
}
finally(cb){
// cb && cb();
this.then(cb,cb);
}
}
const PENDING = 'pending';
const FULFILLED = 'fulfilled'
const REJECTED = 'rejected'
class MyPromise {
constructor(executor) {
try {
executor(this.resolve, this.reject)
} catch (e) {
this.reject(e)
}
}
status = PENDING //初始状态
value = undefined
reason = undefined
//successcallback 延迟成功回调
successCallback = []
//failcallback 延迟失败回调
failCallback = []
resolve = value => {
if (this.status != PENDING) return
this.status = FULFILLED
this.value = value
while (this.successCallback.length) this.successCallback.shift()()
}
reject = reason => {
if (this.status != PENDING) return;
this.status = REJECTED
this.reason = reason
while (this.failCallback.length) this.failCallback.shift()()
}
then(successCallback, failCallback) {
successCallback = successCallback ? successCallback : value => value
failCallback = failCallback ? failCallback : reason => reason
let promise2 = new MyPromise((resolve, reject) => {
if (this.status === FULFILLED) {
setTimeout(() => {
try {
let value = successCallback(this.value)
//判断value是普通值还是promise对象
resolvePromise(promise2, value, resolve, reject)
} catch (e) {
console.log('123')
reject(e)
}
}, 0)
} else if (this.status === REJECTED) {
setTimeout(() => {
try {
let value = failCallback(this.reason)
//判断value是普通值还是promise对象
resolvePromise(promise2, value, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
} else {
//wait
this.successCallback.push(() => {
setTimeout(() => {
try {
let value = successCallback(this.value)
//判断value是普通值还是promise对象
resolvePromise(promise2, value, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
})
this.failCallback.push(() => {
setTimeout(() => {
try {
let value = failCallback(this.reason)
//判断value是普通值还是promise对象
resolvePromise(promise2, value, resolve, reject)
} catch (e) {
reject(e)
}
}, 0)
})
}
})
return promise2;
}
static all(array) {
let result = []
let index = 0
return new MyPromise((resolve, reject) => {
function addDate(key, value) {
result[key] = value
index++;
if (index === array.length) {
resolve(result)
}
// console.log(index)
}
for (let i = 0; i < array.length; i++) {
let current = array[i]
if (current instanceof MyPromise) {
// promise对象
current.then(value => addDate(i, value), reason => {
reject(reason)
})
} else {
//普通值
addDate(i, array[i])
}
}
})
}
static resolve(value) {
if (value instanceof MyPromise) {
return value
} else {
return new MyPromise(resolve => {
resolve(value)
})
}
}
finally(callback) {
return this.then(value => {
return MyPromise.resolve(callback()).then(() => value)
}, reason => {
return MyPromise.resolve(callback()).then(() => {
throw reason
})
})
}
catch(failCallback) {
console.log(123)
return this.then(undefined, failCallback)
}
}
function resolvePromise(promise, value, resolve, reject) {
if (promise == value) {
return reject(new TypeError('error'))
}
if (value instanceof MyPromise) {
//对象
// value.then(value => {
// resolve(value)
// }, reason => {
// reject(reason)
// })
value.then(resolve, reject)
} else {
//普通值
resolve(value)
}
}
module.exports = MyPromise