@truenewx/tnxcore
Version:
互联网技术解决方案:JavaScript核心扩展支持
43 lines (41 loc) • 1.56 kB
text/typescript
/**
* 具有默认错误处理函数的Promise
* 当调用者未catch时,由默认错误处理函数兜底;调用者有catch时,默认错误处理函数不会执行
*/
export default class SafePromise<T> extends Promise<T> {
constructor(
executor: (resolve: (value: T) => void, reject: (reason?: any) => void) => void,
defaultErrorHandler?: (err: any) => void,
) {
if (typeof defaultErrorHandler !== 'function') {
super(executor);
} else {
super((resolve, reject) => {
const errorContainer: { cause?: any } = {};
const caughtReject = (cause: any) => {
errorContainer.cause = cause;
reject(errorContainer);
setTimeout(() => {
if (errorContainer.cause) {
defaultErrorHandler(errorContainer.cause);
}
}, 10);
};
try {
executor(resolve, caughtReject);
} catch (e) {
caughtReject(e);
}
});
}
}
catch<U = never>(handler: (reason: any) => U | PromiseLike<U>): Promise<U> {
return super.catch((error: any) => {
const cause = error && error.cause;
if (error && 'cause' in error) {
delete error.cause;
}
return handler(cause);
}) as Promise<U>;
}
}