在catch块中处理异常

时间:2018-12-10 19:31:36

标签: javascript

我有几个异步回调,我想一个接一个地尝试。

这些旨在在运行异步测试失败的情况下引发错误。

测试从最大到最小检查用户的特权。因此,如果我们要检查某个用户是否在特定的组中,则首先要检查他们是否是管理员,然后再不需要检查。

我的本​​能是像这样将捕获块链接起来:

try {
  await userIsAdmin;
  next();
} catch(e) {
  await userIsInGroup(group);
  next();
} catch(e) {
  console.log('User is not admin or in the group');
}

我将开始嵌套尝试和捕获,但是我开始闻到老鼠的味道。

这是对多个异步操作进行排序的明智方法吗?可能会或不会引发错误?

2 个答案:

答案 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