@svet1

Как правильно сделать в javascript очередь запросов с задержкой?

Есть набор http запросов, как их выполнить по порядку, с задержкой?

UPD1: На данный момент написано такое решение, но есть опасение, что будут утечки памяти
UPD2: Утечек памяти нет.
class Balancer {
  constructor(kwArr, timeout) {
    this._i = 0;

    this._kwArr = kwArr;
    this._tikTimeout = timeout;

    this.start();
  }

  start() {
    this._instance = setInterval( () => { this._tik(); }, this._tikTimeout );
  }

  stop() {
     clearInterval(this._instance);
  }

  _tik() {
    if(this._i < this._kwArr.length) {
      var kw = this._kwArr[this._i++];
      requestFunc(kwArr.url);
    } else {
      this.stop();
    }
  }
}
  • Вопрос задан
  • 2117 просмотров
Пригласить эксперта
Ответы на вопрос 2
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function doRequest(urls){
  var url = urls.shift();

  if( ! url){
    return Promise.resolve();
  }

  return request(url)
    .then(() => {
      return sleep(5000);
    })
    .then(() => {
      return doRequest(urls);
    });
}

doRequest([
  'http://google.com',
  'http://ya.ru'
])
.then(() => {
  // complete
})
.catch(err => {
  console.error(err);
})
Ответ написан
Комментировать
@Andruxakonst
Немного упростил, думаю так и понятней получилось с es6 и async\await
async function doRequest(urls){
  var url = urls.shift();
  if( ! url){
     console.log("Все запросы выполнены");
    //запускаем процесс который нужен после перебора всех элементов
  }
  //выполняем запрос который вернет промис
  await getData(url);  //запрос данных с сервера. getData(url) указан как пример
  //ждем выполнения таймера
  await new Promise(resolve => setTimeout(resolve, 1000)); //1000 - врем ожидания в ms
  //рекурсивно запускаем функцию с обрезанным shift() массивом urls
  await elevator(phIds);
}

//осталось запустить функцию передав массив
doRequest([
  'http://google.com',
  'http://ya.ru'
]);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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