Правильное использование промисов

Уже это обсуждалось несколько раз, но я всё равно не могу понять до конца...

Надеюсь смогу разобраться с вашей помощью :-)

Например мне необходимо выполнить последовательно запросы к БД и произвести определенные действия. Сейчас я делаю так:

await model.findAll({
    where: ...
  })
  .then(data => {
    что - то делаю с ответом
    return data;
  })
  .then(data => {
    опять что - то делаю с ответ и например дальше нужно делать еще запросы исходя из текущих ответов
    const options = {
      id: data.userId,
      user: data.color
    }
    await model.create(options)
      .then(createData => {
        for (const item of elem) {
          await model.destroy({
            where: ...
          })
        }
      })
      .catch(err)
  })
  .catch(err)

т.е. в частности меня интересует на сколько я правильно делаю с "вложенным" then/catch. Я это представляю себе так что в случае ошибки каждый catch будет на своём уровне отлавливать ошибку (на самом деле у меня более "вложенная" структура) и это вроде как реально работает :-), но вот на сколько правильно я это использую всё?


Ответы (1 шт):

Автор решения: muturgan

Правильно с какой точки зрения? Я пишу по разному в зависимости от условий.
Если говорить о синтаксисе, то как минимум на строчке

await model.create(options)

возникнет ошибка, так как на строчке

.then(data => {
    опять что - то делаю с ответ

ты не помечаешь функцию как async. (и на строчке await model.destroy({ тоже)

По поводу вложенности catch - сейчас да, каждый catch отлавливает ошибку только на своем уровне вложенности. Но можно оставить только 1 внешний catch и он будет ловить все ошибки (иногда нужно специфическим образом обрабатывать ошибку на одном из уровней вложенности, но как правило 1 catch хватает).

С точки зрения читаемости предлагаю переписать код приблизительно так:

const MyAwesomeMethod = async function() {
  try {
    const data = await model.findAll({
      where: ...
    });

    const data1 = что - то делаю с ответом
    const data2 = опять что - то делаю с ответ

    const options = {
      id: data.userId,
      user: data.color
    }

    const createData = await model.create(options);

    // в используемом тобой цикле for of ты будешь дожидаться окончания каждого удаления и выполнять их последовательно
    // с Promise.all можно выполнять удаления параллельно
    await Promise.all(
       elem.map(item => model.destroy({
           where: ...
       })
    );

  } catch (err) {
    conslole.log('wait! oh shh...');
  }
}
→ Ссылка