ffunction promise(exector) {
let self = this
self.value = null;
self.status = 'pedding';
self.callbacks = [];
function resolve(value) {
if (self.status == 'pedding') {
self.status = 'resolved';
self.value = value;
// 此处为异步方法,应比同步晚执行,放入异步队列。
setTimeout(() => {
self.callbacks.forEach(fn => {
fn.onResolved(self.value);
})
}, 0);
}
}
function reject(error) {
if (self.status == 'pedding') {
self.status = 'rejected';
self.value = error;
// 此处为异步方法,应比同步晚执行,放入异步队列。
setTimeout(() => {
self.callbacks.forEach(fn => {
fn.onRejected(self.value);
})
}, 0);
}
}
try {
exector(resolve, reject)
} catch (e) {
reject(e)
}
}
promise.prototype.then = function (onResolved, onRejected) {
let self = this
// 穿透
onResolved = typeof onResolved == 'function' ? onResolved : function () {return self.value }
onRejected = typeof onRejected == 'function' ? onRejected : function () {return self.value }
// 链式返回仍是 promise
return new promise((resolve, reject) => {
// 为了解决 resolve 被放入异步队列,状态还处于pedding的时候无法执行下面的方法。
if (self.status == 'pedding') {
self.callbacks.push({
onResolved: val => {
try {
let res = onResolved(self.value);
resolve(res)
} catch (e) {
reject(e)
}
},
onRejected: val => {
try {
let res = onRejected(self.value);
resolve(res)
} catch (e) {
reject(e)
}
}
})
}
if (self.status == 'resolved') {
setTimeout(() => {
try {
let res = onResolved(self.value);
resolve(res)
} catch (e) {
reject(e)
}
}, 0);
}
if (self.status == 'rejected') {
setTimeout(() => {
try {
let res = onRejected(self.value);
resolve(res)
} catch (e) {
reject(e)
}
}, 0);
}
})
}
手动实现简单Promise
最新推荐文章于 2022-04-01 12:55:25 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)