将 setTimeout 与地图一起使用以避免 API 速率限制的问题

Issues using setTimeout with map to avoid API rate limiting

我正在使用 Spotify 的 Web API 进行一个项目,但我 运行 遇到了一些遇到速率限制的问题。

我有一个包含大约 500 位艺术家的数组,我想循环遍历该数组,使用 axios 从 Spotify API 中为每位艺术家获取一张照片。为避免速率限制,我在地图中使用了 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);
  });
};

解决方案编辑:

非常感谢 Matti Price 的回答。这就是他建议我修复它的方法,并且有效:

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);
  });
};

setTimeout 本质上是异步的,所以它不会等待函数触发然后触发下一个,它会非常快速地循环并创建所有回调以在 500 毫秒内触发,因此它们全部都同时开火。

在你的地图函数中添加索引,并将延迟时间乘以索引,这样它就创建了每 500 毫秒交错一次的时间。