异常捕获补充
1、执行器的异常捕获
constructor(executor) {
try {
executor(this.resolve, this.reject);
} catch (e) {
this.reject(e)
}
}
2、then方法回调函数的异常捕获
then = (successCallback, failCallback) => {
successCallback = successCallback ? successCallback : value => value;
failCallback = failCallback ? failCallback : reason => { throw reason };
const promise = new MyPromise((resolve, reject) => {
if(this.status === FULFILLED) {
setTimeout(() => {
try {
const x = successCallback(this.value);
// 判断 x 的类型,是普通值,还是promise对象
// 如果 x 时普通值,则直接调用resolve返回
// 如果 x 是promise对象,则调用then方法,获取状态,并根据状态调用相对应的回调函数
resolvePromise(promise, x, resolve, reject);
} catch (e) {
this.reject(e);
}
}, 0);
} else if(this.status === REJECTED) {
setTimeout(() => {
try {
const x = successCallback(this.value);
// 判断 x 的类型,是普通值,还是promise对象
// 如果 x 时普通值,则直接调用resolve返回
// 如果 x 是promise对象,则调用then方法,获取状态,并根据状态调用相对应的回调函数
resolvePromise(promise, x, resolve, reject);
} catch (e) {
this.reject(e);
}
}, 0);
} else {
this.successCallback.push(() => {
setTimeout(() => {
try {
const x = successCallback(this.value);
// 判断 x 的类型,是普通值,还是promise对象
// 如果 x 时普通值,则直接调用resolve返回
// 如果 x 是promise对象,则调用then方法,获取状态,并根据状态调用相对应的回调函数
resolvePromise(promise, x, resolve, reject);
} catch (e) {
this.reject(e);
}
}, 0);
});
this.failCallback.push(() => {
setTimeout(() => {
try {
const x = successCallback(this.value);
// 判断 x 的类型,是普通值,还是promise对象
// 如果 x 时普通值,则直接调用resolve返回
// 如果 x 是promise对象,则调用then方法,获取状态,并根据状态调用相对应的回调函数
resolvePromise(promise, x, resolve, reject);
} catch (e) {
this.reject(e);
}
}, 0);
});
}
});
return promise;
}