2 回答

TA貢獻1848條經驗 獲得超2個贊
您可以每分鐘發送1個包含20個請求的塊,或者每3秒將其間隔1個請求(這可能是API所有者更喜歡的)。
function rateLimitedRequests(array, chunkSize) {
var delay = 3000 * chunkSize;
var remaining = array.length;
var promises = [];
var addPromises = function(newPromises) {
Array.prototype.push.apply(promises, newPromises);
if (remaining -= newPromises.length == 0) {
Promise.all(promises).then((data) => {
... // do your thing
});
}
};
(function request() {
addPromises(array.splice(0, chunkSize).map(apiFetch));
if (array.length) {
setTimeout(request, delay);
}
})();
}
要每3秒撥打1個電話:
rateLimitedRequests(bigArray, 1);
或每分鐘20個:
rateLimitedRequests(bigArray, 20);
如果您喜歡使用_.chunk和1:_.debounce _.throttle
function rateLimitedRequests(array, chunkSize) {
var delay = 3000 * chunkSize;
var remaining = array.length;
var promises = [];
var addPromises = function(newPromises) {
Array.prototype.push.apply(promises, newPromises);
if (remaining -= newPromises.length == 0) {
Promise.all(promises).then((data) => {
... // do your thing
});
}
};
var chunks = _.chunk(array, chunkSize);
var throttledFn = _.throttle(function() {
addPromises(chunks.pop().map(apiFetch));
}, delay, {leading: true});
for (var i = 0; i < chunks.length; i++) {
throttledFn();
}
}
1您可能想要,_.throttle因為它會在延遲后執行每個函數調用,而_.debounce將多個調用組合為一個調用??吹竭@個文章從鏈接的文檔
防抖動:把它看成是“分組多個事件之一”。試想一下,你回家,在電梯進入,門正在關閉......,突然你的鄰居出現在大廳,并試圖跳上電梯。要有禮貌!并打開大門,他說:你去抖動電梯離去??紤]到同樣的情況可以與第三人再次發生,等等...大概推遲起飛幾分鐘。
油門:將其視為閥門,它調節執行流程。我們能確定的時間函數可以在一定時間內被稱為最大數。所以在電梯比喻..你有足夠的禮貌,讓在持續10秒的人,但一旦延遲的推移,你必須去!
添加回答
舉報