@nezzard

Как в node.js сделать задержку в цикле?

Добрый вечер, подскажите пожалуйста, как реализовать задержку в запросе такого вида
result.forEach(function(items) {
			request.get("https://www.googleapis.com/youtube/v3/search?part=snippet&order=viewCount&q="+items['song']+'+'+items['song']+"&type=video&key=AIzaSyAvDAdEnqrStOJNnpnGy9BkrC_sG-gcHIU", function(err,res,body){
          if(res.statusCode == 200 ) {          	
	           console.log(JSON.parse(body)['items'][0].id.videoId);	         
          }
      });
	});


Проблема в том, что ответ от сервера приходит, все работает, но приходит он каждый раз в разном порядке.
Скорее всего это из за того, что сервера гугла обрабатывают запросы с разной скоростью и исходя формируется разная последовательность выведенных данных
Но мне нужно строго по порядку, подскажите как сделать зарержку setInterval не подходит, выдает совсем не то, что нужно
  • Вопрос задан
  • 2062 просмотра
Пригласить эксперта
Ответы на вопрос 3
vitali1995
@vitali1995
Советую изучить Promise. Перед циклом создаётся экземпляр Promise, каждая итерация подписывается методом then на следующий запрос. После цикла можно в промис добавить последний then, который продолжит выполнять задачу, когда будет получен последний запрос. Когда функция завершается, event loop начинает последовательно выполнять запросы, добавленные Промисом.
Выглядит примерно так:

let promise = Promise.resolve();
for(...) {
  promise.then( () => {
    return new Promise((resolve) => {
      request.get(..., (data) => {... resolve(data);});
    }
  }
}
promise.then((lastData) => {...});
Ответ написан
abyrkov
@abyrkov
JavaScripter
Отказаться от forEach... точнее, использовать вместо него for в генераторе.
function* code(result) {
  for(var i = 0; i < result.length; i++) yield result[i];
}
function code2(gen) {
  items = gen.next().value;
  request.get("https://www.googleapis.com/youtube/v3/search?part=snippet&order=viewCount&q="+items['song']+'+'+items['song']+"&type=video&key=AIzaSyAvDAdEnqrStOJNnpnGy9BkrC_sG-gcHIU", function(err,res,body){
          if(res.statusCode == 200 ) {          	
             console.log(JSON.parse(body)['items'][0].id.videoId);	
             code2(gen);         
          }
      });
}
let gen = code(result);
code2(gen);
Ответ написан
@antonecma
Nodejs backender
Если вам не по душе ES6 (очень зря кстати), используйте старый добрый модуль async.
npm i async --save


var items = []; //здесь ваш массив
async.eachSeries(items, function(item, callback) {
      request.get("https://www.googleapis.com/youtube/v3/search?part=snippet&order=viewCount&q="+item['song']+'+'+item['song']+"&type=video&key=AIzaSyAvDAdEnqrStOJNnpnGy9BkrC_sG-gcHIU", function(err, res, body){
          if(res.statusCode == 200 ) {          	
             console.log(JSON.parse(body)['items'][0].id.videoId);	
             callback();
          } else {
              callback('Error');
          }
        
      });    
}, function(err) {
    if( err ) {
            console.log('Ошибка случилась');
          } else {
      console.log('Все хорошо едем дальше');
    }
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы