Проблемы с использованием setTimeout с картой, чтобы избежать ограничения скорости API - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над проектом с помощью веб-API Spotify, и у меня возникают проблемы с ограничением скорости.

У меня есть массив из около 500 художников, и я хочу пройтись по массиву, чтобы получить фотографию для каждого художника из API Spotify с помощью axios. Чтобы избежать ограничений скорости, я использую setTimeout на карте, поэтому между каждым вызовом API есть задержка в полсекунды.

То, как я его сейчас настроил, карта срабатывает одновременно, и меня ограничивают.

Вот код, с которым я работаю. noPhoto - это массив имен художников. Спасибо!

const addArtistSpotifyPhoto = (req, res) => {
  console.log(noPhoto);
  noPhoto.map(e => {
    console.log(e);
    setTimeout(() => {
      axios
        .get(
          `https://api.spotify.com/v1/search?q=${e
            .split(' ')
            .join('%20')}&type=artist&limit=1`,
          {
            headers: { Authorization: `Bearer ${req.user.accessToken}` }
          }
        )
        .then(response => {
          console.log(e, response.data.artists.items.images);
        })
        .catch(console.log);
    }, 500);
  });
};

Редактирование решения:

Большой крик на ответ Матти Прайс. Вот как он предложил мне это исправить, и это работает:

const addArtistSpotifyPhoto = (req, res) => {
  console.log(noPhoto);
  noPhoto.map((e, i) => {
    console.log(e);
    setTimeout(() => {
      axios
        .get(
          `https://api.spotify.com/v1/search?q=${e
            .split(' ')
            .join('%20')}&type=artist&limit=1`,
          {
            headers: { Authorization: `Bearer ${req.user.accessToken}` }
          }
        )
        .then(response => {
          console.log(e, response.data.artists.items.images);
        })
        .catch(console.log);
    }, 500 * i);
  });
};

1 Ответ

0 голосов
/ 07 ноября 2018

setTimeout по сути асинхронный, поэтому он не будет ждать запуска функции и затем запускает следующую, он будет проходить по-настоящему быстро и создавать все обратные вызовы за 500 мс, чтобы все они заканчивали работу сразу.

В вашей функции карты добавьте индекс и умножьте время задержки на индекс, чтобы он создавал их в шахматном порядке 500 мс.

...