我正在使用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);
}
以上代码无错误;只是无法弄清楚如何正确设置延迟。
答案 0 :(得分:0)
您可以尝试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);
}