[英]Make multiple get request but with a minute limit of 10 request/minute NodeJS
我會盡快解釋我的問題。 我正在使用 NodeJS 從 url 檢索響應,我必須向該 URL 發出多個請求。
我只有一個限制:我每分鍾不能發出超過 10 個請求。 我該如何處理這個問題?
我也嘗試遵循該堆棧溢出響應: 向 API 發出多個請求,每分鍾只能處理 20 個請求
但該方法不起作用,因為它不等待所有 promise 並給出未定義的結果
實際上我正在使用該代碼但它沒有等待所有響應,它直接給我 undefined 然后所有請求都完成了:
async function rateLimitedRequests(array, chunkSize) {
var delay = 3000 * chunkSize;
var remaining = array.length;
var promises = [];
var addPromises = async function(newPromises) {
Array.prototype.push.apply(promises, newPromises);
if (remaining -= newPromises.length == 0) {
await Promise.all(promises).then((data) => {
console.log(data);
});
}
};
(async function request() {
addPromises(array.splice(0, chunkSize).map(apiFetch));
if (array.length) {
setTimeout(request, delay);
}
})();
}
您可以通過實施Promise.all
方法來完成。
例如:
const [response1, response2, response3] = await Promise.all([ axios.get(URL_HERE), axios.get(URL_HERE), axios.get(URL_HERE) ];
控制台日志(響應1);
控制台日志(響應3);
控制台日志(響應2);
對於我們在評論部分下面討論的場景 2
function rateLimiter(array = [], chunkSize = 10 ) {
const delay = 10 * 1000;
return new Promise((resolve, reject) => {
let results = [];
const callback = (iteration = 0) => {
const process = array.slice(iteration * chunkSize, chunkSize);
if(!process.length) return resolve(results);
Promise.all(process).then(responses => {
results = [ ...results, ...responses ];
const processLength = array.slice((iteration + 1) * chunkSize, chunkSize).length;
if(!processLength) return resolve(results);
setTimeout(() => {
callback(iteration + 1);
}, delay)
})
}
callback();
})
}
let results = await rateLimiter([ axios.get('URL_HERE'), axios.get('URL_HERE') ], 20);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.