【发布时间】:2017-11-23 15:15:14
【问题描述】:
我喜欢 Typescript 等中可用的新 Async/Await 功能的平坦度。但是,我不确定我是否喜欢必须在外部声明变量 I'm awaiting 的事实try...catch 块以便以后使用它。像这样:
let createdUser
try {
createdUser = await this.User.create(userInfo)
} catch (error) {
console.error(error)
}
console.log(createdUser)
// business
// logic
// goes
// here
如果我错了,请纠正我,但在 try 正文中放置多行业务逻辑似乎是最佳实践不是,所以我只剩下替代方案了在块外声明createdUser,在块中赋值,之后使用。
在这种情况下,最佳做法是什么?
【问题讨论】:
-
“最佳实践”是使用有效且易于理解、可维护等的方法。我们如何“正确”回答这个问题?我只使用
var,知道变量会被提升。那是“错误的”吗? -
try/catch 应该包含您想要捕获异常的确切内容。如果您要明确查找来自
this.User.create()的错误,那么您不会在 try/catch 中添加任何其他内容。但是,将一大堆逻辑放在 try 块中也是一个非常合理的设计。这一切都取决于您希望如何/在何处处理错误,以及您希望如何设计异常处理代码以及对给定操作有意义的内容。没有通用的最佳实践。一个通用的最佳实践是确保以某种适当的方式捕获和处理所有错误。 -
async/await是 ES2017(今年发布)的一部分,而不是 ES6(两年前发布)。 -
要添加到@jfriend00 的评论中,如果您将业务逻辑放在
try块中,并且该代码Errors,(TypeError,ReferenceError等),那将是catched,如果您只希望catch承诺拒绝,这可能会产生意外行为。
标签: javascript promise async-await try-catch ecmascript-2017