Javascript:使用try-catch嵌套

时间:2019-07-02 03:10:38

标签: javascript node.js ecmascript-6 promise try-catch

我试图首先创建一个条件语句,因为下面存在三个条件,并且如果其中一个查询未定义,则代码由于错误而停止。

const getEmptyCartQuery = await shopping_cart.findOne({
  (...)
});
const needsUpdatedQuantityQuery = await shopping_cart.findOne({
  (...)
});
const needsNewCartQuery = await shopping_cart.findOne({ 
  (...)
});

因此,我编写了以下代码,并使用try-catch语句进行了异常处理。

const data = await shopping_cart.findAll({
    where: { cart_id }
});

try {
    const getEmptyCart = await shopping_cart.findOne({ (...) });
    if (getEmptyCart) {
      await shopping_cart.update({ (...) });
    }
    ctx.body = data;
  } catch (e) {
    try {
      const needsUpdatedQuantity = await shopping_cart.findOne({ (...) });
      if (needsUpdatedQuantity) {
        await shopping_cart.update({ (...) });
      }
      ctx.body = data;
    } catch (e) {
      try {
        const needsNewCart = await shopping_cart.findOne({ (...) });
        if (needsNewCart) {
          await shopping_cart.create({ (...) });
        }
      } catch (e) {
        ctx.status = 400;
        ctx.body = e.message;
      }
    }
  }

它可以工作,但是我可以使用上述的嵌套try-catch语句吗?在db查找而不是try-catch期间,代码还有其他方法可以无错误地流动吗?

如果您有其他需要补充的信息,请通过评论或回复的方式告知我。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Promise.all

Promise.all([shopping_cart.findOne({ ... }), shopping_cart.findOne({ ... }), shopping_cart.findOne({ ... })])
  .then(data => { /* Everything worked! */ })
  .catch(err => { /* There was an error */ });

答案 1 :(得分:0)

使用@Jack Bashford的解决方案,如果您更喜欢以异步/等待方式进行处理,则可以编写如下相同的语句:

try {
  const [result1, result2, result3] = await Promise.all([
      shopping_cart.findOne({ ...}),
      shopping_cart.findOne({ ...}),
      shopping_cart.findOne({ ...})
  ]);
  // use the results
} catch (error) {
  // catch the error
}