拒绝承诺会抛出 "Uncaught (in promise)"

Rejecting a promise throws "Uncaught (in promise)"

我正在使用 promises to handle 来处理模态对话框:当用户按下“确定”按钮时解决,当取消或关闭时拒绝。

要解决和关闭模态,我使用以下方法:

    let modalResolve, modalReject;
    modal.promise = new Promise<any>((resolve, reject) => {
        modalResolve = resolve;
        modalReject = reject;
    });
    modal.close = (result) => {
        if (modal.isOpen) {
            modalResolve(result);
        }
    };
    modal.dismiss = (reason) => {
        if (modal.isOpen) {
            modalReject(reason);
        }
    };
    modal.promise.finally(() => modalElement.remove());

当取消按钮在模式中触发此方法时:

modal.dismiss('close')

一切正常,模态隐藏,但控制台错误记录在这个描述和堆栈中:

Error: Uncaught (in promise): close
    at resolvePromise (zone.js:814)
    at resolvePromise (zone.js:771)
    at eval (zone.js:873)
    at ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:4751)
    at ZoneDelegate.invokeTask (zone.js:420)
    at Zone.runTask (zone.js:188)
    at drainMicroTaskQueue (zone.js:595)
    at ZoneTask.invokeTask [as invoke] (zone.js:500)
    at invokeTask (zone.js:1540)

这很奇怪,因为模态无论如何都被关闭了,而且这个错误并没有显示在我使用的所有模态上,只是在其中一些模态上。解析不会产生此类错误。

您必须catch它以防止错误

modal.promise.then(hideFn, hideFn).catch((res) => {});

就像Amaya说的,你必须使用catch来捕获错误,否则它会变成UnhandledPromiseRejection,不同的promise供应商有不同的实现来处理这种UnhandledPromiseRejection,但无论哪种方式,它都会在某个时候抛出,所以 zone.js 将在下一个 tick.

抛出错误

而且我看你已经用finally了,如果你用finally UnhandledPromiseRejection应该不会抛出,但是你需要用zone.js 0.8.26来支持Promise.finally,如果还是报错升级 zone.js 时存在,请告诉我或在 zone.js 存储库中提出问题,https://github.com/angular/zone.js/issues