我喜欢Typescript等中提供的新Async/Await
功能的平坦性。但是,我不确定我是否喜欢这样一个事实,我必须在await
块的外部声明我是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
并将其分配在块中的选择,然后再使用它。在这种情况下,最佳做法是什么?
最佳答案
其实我会说是的。您通常希望使用值对该文件进行catch
:
try {
const createdUser = await this.User.create(userInfo);
console.log(createdUser)
// business logic goes here
} catch (error) {
console.error(error) // from creation or business logic
}
如果您只想捕获并处理 promise 中的错误,则有三种选择:
catch
块早期
return
或re- throw
catch
块catch
块是否捕获到异常,并在if
条件下对其进行测试let createdUser; // or use `var` inside the block
try {
createdUser = await this.User.create(userInfo);
} catch (error) {
console.error(error) // from creation
}
if (createdUser) { // user was successfully created
console.log(createdUser)
// business logic goes here
}
try {
const createdUser = await this.User.create(userInfo);
// user was successfully created
console.log(createdUser)
// business logic goes here
} catch (error) {
if (error instanceof CreationError) {
console.error(error) // from creation
} else {
throw error;
}
}
不幸的是,标准JavaScript(仍然)不支持conditional exceptions的语法。
then
with two callbacks代替try
/catch
。这确实是最丑陋的方式,我个人的建议也是出于其简单性和正确性,而不是依靠标记的错误或结果值的外观来区分对 promise 的实现和拒绝:await this.User.create(userInfo).then(createdUser => {
// user was successfully created
console.log(createdUser)
// business logic goes here
}, error => {
console.error(error) // from creation
});
当然,它具有引入回调函数的缺点,这意味着您不能像从外部函数那样轻易地进行
break
/continue
循环或执行早期return
那样。