Как поставить в очередь вызовы API с задержкой в ​​1 секунду в JS, используя setInterval () внутри функции map () - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть функция getData, которая извлекает данные из внешнего API.Если я делаю более 1 запроса в секунду, я получаю 503 ошибку.Следовательно, я думаю поставить в очередь запросы API, но эти вызовы все еще пакетируются, и я получаю ту же ошибку 503.

Я анализирую данные Local Storage как объекты (каждый объект будет делать отдельный запрос API)и если имеется более 1 объекта - я хочу поставить в очередь все последующие вызовы API с задержкой в ​​1 секунду.Вот мой код:

const lsData = JSON.parse(localStorage.getItem('weatherappData'));
if (lsData) {
    lsData.map((location, index) => {
        const city = location.city;
        const country = location.country;
        if (index === 0) {
            getData(city, country, table);
        } else {
            setTimeout(() => getData(city, country, table), 1000);
        }
    });
}

Что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 17 февраля 2019

.map() не ожидает предыдущего callback.Вы можете умножить 1000 на index

setTimeout(() => getData(city, country, table), index * 1000);

или использовать async/await.

(async() => {
  for (const [index, {city, country}] of lsData.entries()) {
    try {
      if (index === 0) {
        await getData(city, country, table);
      } else {
        await new Promise(resolve => setTimeout(() => resolve(getData(city, country, table)), 1000))
      }
    } catch(e) {
        console.error(e)
    }
  }
})()

Примечание. table не определено в коде в вопросе.

...