我喜欢在Typescript等中提供的新Async/Await
功能的平坦性。但是,我不确定我喜欢这样的事实,我必须在await
块的外面声明变量我是try...catch
ing以便以后使用它。像这样:
let createdUser
try {
createdUser = await this.User.create(userInfo)
} catch (error) {
console.error(error)
}
console.log(createdUser)
// business
// logic
// goes
// here
如果我错了,请纠正我,但似乎最好不要在try
体中放置多行业务逻辑,所以我只留下在块外声明createdUser
的替代方案,在块中分配它,然后使用它。
在这种情况下,最佳做法是什么?
似乎最好不要在try体中放置多行业务逻辑
其实我会说是的。您通常希望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
}
如果您只想从承诺中捕获并处理错误,您有三种选择:
catch
块中的变量分配默认值
return
早期或重新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
。这实际上是最不丑的方式,也是我个人的建议,因为它的简单性和正确性,不依赖于标记的错误或结果值的外观来区分履行的履行和拒绝:
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
s。另一种更简单的方法是将.catch附加到promise函数。例如:
const createdUser = await this.User.create(userInfo).catch( error => {
// handle error
})
@Bergi答案很好,但我认为这不是最好的方法,因为你必须回到旧的then()方法,所以我认为更好的方法是捕获异步函数中的错误
async function someAsyncFunction(){
const createdUser = await this.User.create(userInfo);
console.log(createdUser)
}
someAsyncFunction().catch(console.log);
await
并需要捕获每个错误呢?您可以声明to()
函数
function to(promise) {
return promise.then(data => {
return [null, data];
})
.catch(err => [err]);
}
然后
async function someAsyncFunction(){
let err, createdUser, anotherUser;
[err, createdUser] = await to(this.User.create(userInfo));
if (err) console.log(`Error is ${err}`);
else console.log(`createdUser is ${createdUser}`);
[err, anotherUser] = await to(this.User.create(anotherUserInfo));
if (err) console.log(`Error is ${err}`);
else console.log(`anotherUser is ${anotherUser}`);
}
someAsyncFunction();
读它时:“等到这个.User.create”。
最后,您可以创建模块“to.js”或只使用await-to-js模块。
您可以在to
获得更多关于this post功能的信息