【发布时间】:2018-11-07 14:13:54
【问题描述】:
我正在将我的承诺链代码重构为异步/等待风格。这样做的原因之一是我想要一个单独的 catch 块来处理所有错误情况(如此处所述Understanding promise rejection in node.js)
我的问题是,当我遇到同步错误时,我应该致电await Promise.reject 或throw error 来解决这个过程吗?
我知道任何一种方式都可以,但我更喜欢throw error。我已经知道我得到了无效的结果,为什么还要等待?使用 throw 立即终止控制流似乎是一个更好的选择。
我不是在谈论承诺链(我的问题的重点),所以我不认为线程 JavaScript Promises - reject vs. throw 回答了我的问题。
我阅读了Error Handling in Node.js 的文章,我认为它也没有给出答案。但它确实说
一个给定的函数应该会产生操作错误 同步(使用 throw)或异步(使用回调或事件) 发射器),但不是两者都。 ... 一般来说,使用 throw 和 Expecting 使用 try/catch 的调用者非常少见……
我的异步函数可能会返回 Promise.reject。因此,我担心引入 2 种方法来传递该文章所针对的错误。
try {
let result = await aysncFunc().
if (!isResultValid(result)) { //isResultValid() is sync function
await Promise.reject('invalid result')
//or throw 'invalid result'
}
... //further processing
}
catch (error) {
...
}
【问题讨论】:
-
I know either way will work but I prefer throw error- 好吧,继续做吧 - 但你确定任何一种方法都行吗? -
"但是你确定任何一种方法都行吗?"我有 99% 的把握。但这也是我提出问题的原因之一。
-
当然它是 100% 有效的(就像在你的代码块中一样)。我更喜欢直接抛出错误+1,你在同步代码中抛出的任何东西都可能被捕获。它只是更加优雅和自然。
await Promise.reject()是多余的,可能会引起某些人的困惑。 -
但我认为你可能会走向错误的方向。不要为了时髦而使用
async/await。在真正需要的时候使用它;即异步操作,如果您有两个或更多独立的异步操作,也可以使用await Promise.all([...])。 -
另外,它的另一个原因是性能,但在大多数情况下它只是微不足道的。
标签: javascript node.js promise async-await