![](/img/trans.png)
[英]Why my async function doesn't await to the Promise in JavaScript?
[英]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.