繁体   English   中英

在 javascript 中,为什么在 promise 捕获时 await 不返回错误?

[英]In javascript, why doesn't await return an error when a promise catches?

我喜欢 async/await,但我不明白为什么我们必须将 await 包装在 try/catch 块中以捕获错误。 为什么不让 await 返回某种类型的标准化错误 object 然后我们对此进行测试?

然后我们可以这样做:

let results = await somePromise();
results?.err ? doSomething() : handleErr()

async/await的要点是允许以更类似于同步代码的方式编写异步/基于承诺的代码。 同步代码使用try/catch来处理异常,因此 按照最不意外的原则await也应该如此。

错误处理由作者决定。 如果您不控制某些抛出的代码,并且希望它不抛出,请用捕获但不抛出的东西包装它。 在您自己的代码中,您应该随意返回错误对象而不是抛出。

请注意,其他人已经开始期望将 throw/catch 作为惯例。

// this one throws errors 
import fnNotControlledByMe from 'external_lib'  

// use this one as a wrapper, and don't throw
// this and any other function you write can opt not to throw
async function fnControlledByMe() {
  try {
    let results = fnNotControlledByMe();
    return results;
  } catch (err) {
    return { err };
  }
}

async function opFunction() {
  let results = await fnControlledByMe();
  results?.err ? doSomething() : handleErr()
}

为什么不让await返回某种类型的标准化错误 object 然后我们对此进行测试?

因为这假设您总是想测试错误。 在许多(大多数)情况下,您不需要。 你想让异常传播。 这会导致大量样板代码(如带有error参数的节点回调模式)、被无知(无意识)的程序员忽略的错误以及重构风险。

正如@SeanSutherland 在他的回答中指出的那样,这也使异步错误处理与同步错误处理对称,具有相同的期望

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM