Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将setTimeout与map一起使用以避免API速率限制的问题_Javascript_Axios_Settimeout_Spotify - Fatal编程技术网

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

Javascript 将setTimeout与map一起使用以避免API速率限制的问题,javascript,axios,settimeout,spotify,Javascript,Axios,Settimeout,Spotify,我正在从事一个使用Spotify的Web API的项目,但在达到速率限制方面遇到了一些麻烦 我有一个大约500名艺术家的阵列,我想在阵列中循环,使用axios从Spotify的API为每个艺术家获取一张照片。为了避免速率限制,我在映射中使用了setTimeout,因此每次调用API之间都有半秒的延迟 按照我现在设置的方式,地图一次触发,我受到限制 这是我正在使用的代码。noPhoto是艺术家姓名的数组。谢谢 const addArtistSpotifyPhoto = (req, res) =&g

我正在从事一个使用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);
  });
};
解决方案编辑:

对马蒂·普莱斯的回答大声呼喊。这就是他建议我修复它的方式,它是有效的:

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毫秒内创建所有要启动的回调,因此它们都会立即启动

在map函数中,添加索引,并将延迟时间乘以索引,这样它将创建500毫秒的延迟时间