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