我正在使用axios向Deezer API发出请求。不幸的是,使用Deezer的API,当您请求艺术家的专辑时,它不包括专辑曲目。因此,我通过请求艺术家的专辑,然后为每个专辑执行后续的axios请求来解决这个问题。我遇到的问题是API将请求限制为每5秒50个。如果一个艺术家有超过50张专辑,我通常会得到一个“配额超出”的错误。有没有一种方法可以将axios请求限制到每5秒50张,特别是在使用axios.all时?
var axios = require('axios');
function getAlbums(artistID) {
axios.get(`https://api.deezer.com/artist/${artistID}/albums`)
.then((albums) => {
const urls = albums.data.data.map((album) => {
return axios.get(`https://api.deezer.com/album/${album.id}`)
.then(albumInfo => albumInfo.data);
});
axios.all(urls)
.then((allAlbums) => {
console.log(allAlbums);
});
}).catch((err) => {
console.log(err);
});
}
getAlbums(413);
3条答案
按热度按时间wko9yo5t1#
首先,让我们看看你真正需要什么。这里的目标是,如果你有大量的相册,最多每100毫秒发出一次请求。(使用
axios.all
与使用Promise.all
没有什么不同,你只是想等待所有的请求完成。)现在,有了axios,你就有了拦截API,允许在请求之前插入你的逻辑。
它所做的是对请求进行计时,以便以
intervalMs
毫秒的间隔执行请求。在您的程式码中:
但是,这是一种过于简单的方法,在您的情况下,您可能希望尽快收到请求数小于50的结果。为此,您必须在调度程序中添加某种计数器,该计数器将计算请求数,并根据间隔和计数器延迟请求的执行。
z9gpfhce2#
下面是我使用简单的异步setTimeout / Es6代码的解决方案:
您可以在sleep param函数中设置延迟
您还可以使用以下npm包:https://www.npmjs.com/package/axios-request-throttle
x6yk4ghg3#
NestJS应用程序中有一个模块对我来说非常有用
用3行代码限制axios每秒的请求速率。这个模块和其他类似axios限制的模块的主要区别是你不必创建一个新的axios示例,并且通过扩展不必修复项目范围的导入。应用一次,每个axios.get,post,put,delete等都被限制。
axios-request-throttle