我有几个异步回调,我想一个接一个地尝试。
这些旨在在运行异步测试失败的情况下引发错误。
测试从最大到最小检查用户的特权。因此,如果我们要检查某个用户是否在特定的组中,则首先要检查他们是否是管理员,然后再不需要检查。
我的本能是像这样将捕获块链接起来:
try {
await userIsAdmin;
next();
} catch(e) {
await userIsInGroup(group);
next();
} catch(e) {
console.log('User is not admin or in the group');
}
我将开始嵌套尝试和捕获,但是我开始闻到老鼠的味道。
这是对多个异步操作进行排序的明智方法吗?可能会或不会引发错误?
答案 0 :(得分:1)
一个相对简洁的解决方案,避免.catch
块充当对next()
的调用的错误处理程序,如下所示:
getUser()
.then(async () => {
await userIsAdmin();
next();
})
.catch(async () => {
await userIsInGroup(group);
next();
})
// etc...
通过这种方式,catch块可以明确地充当await
语句的错误处理程序,而不会被错误地用作next()
调用。
答案 1 :(得分:1)
我会像这样重构它:
if (
await userIsAdmin().then(v => true, e => false)) ||
await userIsInGroup(group).then(v => true, e => false)) )
{
next();
}
else {
console.log('User is not admin or in the group');
}
如果愿意,您可以在e =>
lambda中进一步记录错误:
await userIsAdmin().then(v => true, e => console.error(e)))
您还可以重复使用传递给onFulfilled
的{{1}} / onRejected
解析器:
then