【问题标题】:In Angular a Promise with a finally()-Block does not reject properly在 Angular 中,带有 finally()-Block 的 Promise 不能正确拒绝
【发布时间】:2019-08-24 18:18:21
【问题描述】:

我在 Angular 7 应用程序中遇到问题。 当我有一个带有 finally 块的承诺时,不会抛出错误!他们在没有注意到的情况下被吞下,当我删除 finally-block 时,它的行为就像预期的那样

以下是一些示例: 使用 vanillaJS(无 Angular 框架),它可以像我期望的那样工作: 一旦您运行代码,它就会将我的 console.logs 打印到控制台并抛出“Uncaught (in promise)”错误。另请参阅屏幕截图。

Promise.resolve()
    .then(() => {
        console.log('then');
        return Promise.reject('This is an error. Please show up in the console, thank you.');
    })
    .finally(() => {
        console.log('finally');
    });

截图 vanillaJS

这里我们在 Angular 中有相同的代码。请参阅 Stackblitz 以供参考: https://stackblitz.com/edit/angular-iv7cq2

当我删除“finally”时,它会像我期望的那样抛出错误。使用“finally”,它只会吞下错误。

截图角度

这是为什么呢?我必须在哪里修改我的代码,以便带有 finally-blocks 的 Promise 也会抛出错误?

【问题讨论】:

标签: javascript angular es6-promise angular7 zonejs


【解决方案1】:

this_link你可以得到一个最终吞下错误的想法:因为

如果 finally 存在,它指定一个“清理”处理程序。尝试 子句被执行,包括任何 except 和 else 子句。如果 异常发生在任何子句中且未处理,则 暂时保存异常。 finally 子句被执行。如果 有一个保存的异常,它在 finally 结束时重新引发 条款。如果 finally 子句引发另一个异常或执行 return 或 break 语句,保存的异常被丢弃:

我主要在 python 上工作,以上内容取自this python doc,因为它在所有语言中都相同: 但是如果您希望引发和处理错误,那么您可以使用以下语法:

return Promise.resolve()
    .then(() => {
        console.log('then');
        return Promise.reject('This is an error. Please show up in the console, thank you.');
    }).catch ((error) =>{
        console.log('error');

    }).finally(() => {
        console.log('finally');
    });

【讨论】:

  • 感谢您的回答。在您的剪辑中,我确实在 catch 块中有错误。但是我需要抛出错误,因为我有一个自定义错误处理程序,它将错误记录到后端。在您的 sn-p 中,错误不会到达错误处理程序(因为它已被捕获)。不幸的是,在 catch 块中重新抛出也不起作用。
【解决方案2】:

您可以在最后之后捕获并重新抛出错误。

结果:未处理的 Promise 拒绝

Promise.resolve()
    .then(() => {
        console.log('then');
        return Promise.reject('This is an error. Please show up in the console, thank you.');
    })
    .finally(() => {
        console.log('finally');
    }).catch(err => {
        throw err;
    });

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 2022-01-18
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多