День добрый форумчане! Устал бороться в одиночку с «асинхронностью» сии детища NodeJS. Прибегаю к помощи гуру Promises & Multyrequest.
Ситуация такая:
Допустим, у нас в базе (юзаю Pg + Sequalize) есть табличка с данными такого вида:
ID TYPE COUNTER
1 «one» 1
2 «two» 1
В модели есть методы decCounterByType(type); & incCounterByType(type); и вроде бы все ни чего пока не попробуешь использовать эти методы в цикле. Цикл же имитирует многочисленное обращение к базе, пример:
for(let i = 0; i < 1000; i ++) {
Model.incCounterByType(«one»)
.then(res => console.log(`${i}, ${type}, ${res.counter}`))
.catch(console.error);
}
Понимаем да, что вывод будет хаотичен и не каждое обращение получит правильный ответ, т. е. лог будет выглядеть примерно так:
0, «one», 1
3, «one», 2
1, «one», 4
2, «one», 3
Где то на просторах нашел решение, и да, оно работает, блокирует обращение:
let last = Promise.resolve({})
for(let i = 0; i < 1000; i ++) {
last = last .then(() => Model.incCounterByType(«one»))
.then(res => console.log(`${i}, ${type}, ${res.counter}`))
.catch(console.error);
}
в этом случае у нас вывод будет уже:
0, «one», 1
1, «one», 2
2, «one», 3
3, «one», 4
и вроде бы эврика, решение есть! Но, под правильным углом со знаниями работы алгоритма Promise, мы понимаем, что если один из Promise не выполнит «resolve», или выполнит «reject» or «throw» все остальные обращения ждет фиаско. Пока остановился на таком варианте но уверен, за такой костыль будут бить ногами:
let last = Promise.resolve({})
for(let i = 0; i < 1000; i ++) {
last = last .then(() => Model.incCounterByType(«one»))
.then(res => console.log(`${i}, ${type}, ${res.counter}`))
.catch(Promise.resolve));
}
Цель, добиться корректного обращения к БД и синхронный вывод результатов. А как вы блокируете обращения к БД?
Спасибо за участие в обсуждении!