如何在 catch 语句之外拒绝异步/等待?

Posted

技术标签:

【中文标题】如何在 catch 语句之外拒绝异步/等待?【英文标题】:How to reject in async/await outside of catch statement? 【发布时间】:2019-05-17 12:22:45 【问题描述】:

正如this SO post and answer 所述,习惯上从位于 async/await 函数中的 catch 语句抛出错误,如下所示:

 catch (error) 
    throw new Error(400);

正如同一篇文章所强调的,您通常不会返回被拒绝的承诺(见下文),因为它与“try-catch”语句的语义不匹配。

 catch (error) 
    return Promise.reject(new Error(400));

按照同样的逻辑,当从我的 async/await 函数返回 catch 语句之外的错误而不是抛出它们时,我应该返回被拒绝的承诺吗?

也就是说下面的语义和上面的逻辑是不一致的吗?

async function promise () 
    throw new Error('Some error');

而且,这是在 async/await 函数中返回错误的首选方式,因为 async/await 函数隐式返回一个承诺?

async function promise () 
    return Promise.reject(new Error(400));

我知道上述两个 sn-ps 都允许在使用 Promise 时捕获错误。

【问题讨论】:

IMO,你只是抛出错误。无论你是否在 catch 块内投掷都没有关系。 【参考方案1】:

您通常在可能的情况下使用throw,即在async functions 或then 回调中,因为它更简单,因此更易于阅读。 return Promise.reject(…) 确实有效,但很长。

【讨论】:

以上是关于如何在 catch 语句之外拒绝异步/等待?的主要内容,如果未能解决你的问题,请参考以下文章

Node.JS - 无法使用try / catch块获得异步抛出

如何在“react-dropzone”的“onDrop”中使用异步等待? (解析错误:不能在异步函数之外使用关键字'await')

有没有办法将等待/异步 try/catch 块包装到每个函数?

try..catch 没有捕捉到异步/等待错误

如何使节点 fs 与类异步/等待?

在 vue 上运行语句之前如何等待异步完成?