将 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 毫秒交错一次的时间。
我正在使用 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 毫秒交错一次的时间。