Правильное использование промисов
Уже это обсуждалось несколько раз, но я всё равно не могу понять до конца...
Надеюсь смогу разобраться с вашей помощью :-)
Например мне необходимо выполнить последовательно запросы к БД и произвести определенные действия. Сейчас я делаю так:
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 шт):
Правильно с какой точки зрения? Я пишу по разному в зависимости от условий.
Если говорить о синтаксисе, то как минимум на строчке
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...');
}
}