javascript - 在 map() 函数中为 axios 请求设置延迟/超时
我正在使用 Node 和 Axios(带 TS,但这不太重要)来查询 API。我有一套脚本,会调用不同的端点并记录数据(有时会过滤数据)。这些脚本用于调试目的。我正尝试通过在请求之间添加延迟来让这些脚本“更好”,以避免“闪炸” API,特别是当我尝试传递一个大数组时。所以基本上,我希望它先发出 GET 请求,然后在发出下一个请求之前暂停一段时间。
我尝试过使用 setTimeout() 函数,但我只把它们放在请求执行之后增加延迟的地方;我插入函数的任何地方都会有这样的结果。我理解为什么会得到这个结果,我只是想尽一切办法至少增加对事情运作方式的理解。
我曾考虑过尝试建立一个队列或尝试使用拦截器,但我认为用这些想法可能会让我“偏离”一个更简单的解决方案。
另外,我还有另一个我临时写的“基础脚本”(可以说是这批脚本的起点),它是我用for循环而不是map()函数和promise.all构建的。我也尝试过在那个脚本中设置延迟,但没有得到有用的结果。
var axios = require('axios');
var fs = require('fs');
const Ids = [arrayOfIds];
try {
// Promise All takes an array of promises
Promise.all(Ids.map(id => {
// Return each request as its individual promise
return axios
.get(URL + 'endPoint/' + id, config)
}))
.then((vals) =>{
// Vals is the array of data from the resolved promise all
fs.appendFileSync(`${__dirname}/*responseOutput.txt`,
vals.map((v) => {
return `${JSON.stringify(v.data)} \n \r`
}).toString())
}).catch((e) => console.log)
} catch (err) {
console.log(err);
}
上述代码没有错误;只是无法弄清楚如何正确地加入延迟。
答案#1
你可以尝试来自 bluebird 的 Promise.map
它有设置 concurrency 的选项
var axios = require('axios');
var fs = require('fs');
var Promise = require('bluebird');
const Ids = [arrayOfIds];
let concurrency = 3; // only maximum 3 HTTP request will run concurrently
try {
Promise.map(Ids, id => {
console.log(`starting request`, id);
return axios.get(URL + 'endPoint/' + id, config)
}, { concurrency })
.then(vals => {
console.log({vals});
})
;
} catch (err) {
console.log(err);
}
