@djok2142

Как сделать последовательность итераций цикла с асинхронным кодом?

Добрый день.
Изучаю node.js, после синхронного php немного сложно, но очень интересно.

Есть такой упрощенный пример кода:
db.query(" SELECT * FROM users LIMIT 0,100 ", function(err, result) {
	for( row of result ) {
		request('https://site.ru/api/', function (error, response, body) {
			db.query(" UPDATE users SET some_field='"+body+"' WHERE id='"+row['id']+"' ", function(err, result) {
				console.log('User updated');
			});
			
		});
	}
});

В данном коде, из базы данных происходит выборка записей, затем она перебирается циклом, и для каждой записи, делается запрос к апи стороннего сайта, после получения ответа, соответствующая строка в БД обновляется. Так вот, не могу сообразить, как сделать что бы каждая следующая итерация цикла for, происходила только после того как выполнятся асинхронные функции request и db, то есть что бы запросы к сайту шли строго последовательно, сейчас же все происходит параллельно. Скорее всего вместо for нада использовать что то другое, либо что то с использованием промисов, не соображу.
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
@djok2142 Автор вопроса
db.query(sql, async function(err, result) {
  for( let row of result ) {
    let promise = new Promise((resolve, reject) => {
      request(url, function (error, response, body) {
        db.query(sql, function(err, result) {
          console.log('User updated');
          resolve();
        });
        
      });
    });

    let result = await promise;
  }
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
user_of_toster
@user_of_toster
Асинхронный генератор
https://learn.javascript.ru/async-iterators-generators

db.query(query, async (result) => {
    
    for await (let k of generator(result)) {
    ...
}}
Ответ написан
@AstraVlad
Финансист, консультант, программист-любитель
Вот тут много про это написано:
Как работать с async/await в циклах JavaScript
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы