@SeregaZnam

Можно ли увеличить время итерации в цикле map?

Функция domainInfo парсит домен которые передан ей аргументом. Переменная domains представляет собой массив из доменов. Можно установить время через которое будет выполняться следующая итерация? Пытался поставить интервал между итерациями в 3 секунды, но выводится ошибка:
Promise.all(domains.map(setTimeout(function(){domainInfo},3000)))
	.then(function(results) {
		$.ajax({...})
	});


Uncaught TypeError: 9 is not a function
    at Array.map (<anonymous>)
    at HTMLButtonElement.<anonymous> (main.js:76)
    at HTMLButtonElement.dispatch (jquery.min.js:3)
    at HTMLButtonElement.q.handle (jquery.min.js:3)
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
const delay = time => new Promise (resolve => setTimeout(resolve, time));

async function run() {
  const results = [];
  for (const domain of domains) {
    await delay(3000);
    results.push(await domainInfo(domain));
  }
  return results;
}
run().then(function(results) {
    $.ajax({...})
  });;


Для справки - Promise.all - запускает все промисы из переданного ему массива одновременно.
Uncaught TypeError: 9 is not a function - 9 это timeoutID который вернул ваш setTimeout, конечно же девятка это не функция.

И domainInfo должен возвращать промис.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
без async/await (ибо es8 еще не везде есть, а бебел затранспайлит в жуткую хрень):
const delay = timeout => argForChain => new Promise(resolve => setTimeout(resolve, timeout, argForChain));
const delay3000 = delay(3000);
domains.reduce(
  (promise, domain) => promise.then(delay3000).then(() => domainInfo(domain)),
  Promise.resolve()
).then(results => {
  $.ajax({...});
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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