Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2020 June 30

T

Taras in NodeUA - JavaScript and Node.js in Ukraine
for ( let user of usersGoogle) {
   const isExist = await sqlUsers.checkEmailExist(user.email);
   if (isExist) {
     user.status = 'exist';
     } else {
     user.status = 'new';
   }
   await user.save();
 }
источник

AO

Alex O in NodeUA - JavaScript and Node.js in Ukraine
Promise.all или then
источник

AL

Andrey Listochkin in NodeUA - JavaScript and Node.js in Ukraine
Aleksandr и еще мб есть апишка чтобы сразу пачку пользователей сохранить.
источник

AP

Aleksandr Perepichai in NodeUA - JavaScript and Node.js in Ukraine
спасибо буду пробовать
источник

AO

Alex O in NodeUA - JavaScript and Node.js in Ukraine
Promise.all судя по коду тоже не нужен, просто весь блок в асинк функцию, которую не жди
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Ну лично я бы тут вообще избавился от for-а и сделал бы это прям в базе. Типа передали туда список айдишек и в базе уже ставим от того есть или нет статус. Если конечно такое база позволяет делать.
источник

ES

Elena Sharovar in NodeUA - JavaScript and Node.js in Ukraine
через Promise.all эти все его проверки будут выполняться не последовательно а параллельно (ну насколько это возможно в ноде) и если там в массиве будет 2 раза один и тот же email он вставится дважды. циклом оно гарантированно один за одним выполняет. я не ратую за цикл но нужно помнить про эту разницу. если в базе стоит unique constraint то ок
источник

M

Maxim in NodeUA - JavaScript and Node.js in Ukraine
Внутри Promise.all можно попробовать использовать await, думаю, должно быть норм
источник

ES

Elena Sharovar in NodeUA - JavaScript and Node.js in Ukraine
да но последовательным выполнение не будет
источник

DM

Daniel Mednikov in NodeUA - JavaScript and Node.js in Ukraine
источник

M

Maxim in NodeUA - JavaScript and Node.js in Ukraine
Elena Sharovar
да но последовательным выполнение не будет
Почему же? Должно быть последовательно.
источник

АП

Алексей Попов... in NodeUA - JavaScript and Node.js in Ukraine
Elena Sharovar
через Promise.all эти все его проверки будут выполняться не последовательно а параллельно (ну насколько это возможно в ноде) и если там в массиве будет 2 раза один и тот же email он вставится дважды. циклом оно гарантированно один за одним выполняет. я не ратую за цикл но нужно помнить про эту разницу. если в базе стоит unique constraint то ок
цикл не спасёт если в каком-то другом месте во время ожидания тоже сделают вставку, так что unique в базе вообще единственный вариант
но promise.all не вариант, конечно
источник

С

Сергей in NodeUA - JavaScript and Node.js in Ukraine
А чо, цикл по юзерам можно оставить,  но всего с 1 действием user.save, где дергать всего 1 хранимку на стороне БД, куда в качестве параметров передавать все поля юзера, а уже в хранимке  писать основную логику по проверкам, разводкам по статусам, инсертам,  апдейтам, обработке исключений при нарушении уника. Потом эту хранимку можно дергать откуда угодно,  хоть с ноды, хоть руками.
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Andrey Listochkin
Сделай их через await Promise.all(usersGoogle.map(async (u) => { … } ))
Там же нет ограничения на максимальное кол-во параллельных исполнений, это нужно исследовать, как оно при миллионах промисов работает
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Зачем for await? Он все равно по массиву синхронно работает. Да и тут внути цикла await
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Aleksandr Perepichai
for ( let user of usersGoogle) {
   const isExist = await sqlUsers.checkEmailExist(user.email);
   if (isExist) {
     user.status = 'exist';
     await user.save();
   } else {
     user.status = 'new';
     await user.save();
   }
 }
Тут нужно делать асинхронную очередь, бить пачками например по 100 записей и каждую promise.all
А еще нужно orm выбросить к чертям
источник

AL

Andrey Listochkin in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Там же нет ограничения на максимальное кол-во параллельных исполнений, это нужно исследовать, как оно при миллионах промисов работает
Нигде не сказано, что user.save - это база. Мб это вообще внешняя хрень какая.
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Andrey Listochkin
Нигде не сказано, что user.save - это база. Мб это вообще внешняя хрень какая.
Это какая-то гадкая orm-ка которая в объекте предметной область и поля и методы держит
источник

B

Bogdan in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Это какая-то гадкая orm-ка которая в объекте предметной область и поля и методы держит
мб это актив рекорд ( тоже антипаттерн кста )
источник

АП

Алексей Попов... in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Тут нужно делать асинхронную очередь, бить пачками например по 100 записей и каждую promise.all
А еще нужно orm выбросить к чертям
почему по 100 то? 2, при этом не исключено, что и две вставки одновременно будут работать дольше, чем два вызова по одной вставке
источник