Javascript: использование вложения try-catch - PullRequest
0 голосов
/ 02 июля 2019

Сначала я пытаюсь создать условный оператор, потому что ниже приведены три условия, и если один из этих запросов не определен, код останавливается из-за ошибки.

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, как описано выше?Есть ли другой способ, которым код может работать без ошибок при поиске в БД вместо try-catch?

Пожалуйста, дайте мне знать по комментарию или ответу, если у вас есть какая-либо дополнительная информация, которую я должен дополнить.

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы можете использовать Promise.all:

Promise.all([shopping_cart.findOne({ ... }), shopping_cart.findOne({ ... }), shopping_cart.findOne({ ... })])
  .then(data => { /* Everything worked! */ })
  .catch(err => { /* There was an error */ });
0 голосов
/ 02 июля 2019

Используя решение @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
}
...