/**
 * 具有默认错误处理函数的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>;
    }
}
