2 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊
您可以每分鐘發(fā)送1個(gè)包含20個(gè)請求的塊,或者每3秒將其間隔1個(gè)請求(這可能是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個(gè)電話:
rateLimitedRequests(bigArray, 1);
或每分鐘20個(gè):
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因?yàn)樗鼤谘舆t后執(zhí)行每個(gè)函數(shù)調(diào)用,而_.debounce將多個(gè)調(diào)用組合為一個(gè)調(diào)用??吹竭@個(gè)文章從鏈接的文檔
防抖動(dòng):把它看成是“分組多個(gè)事件之一”。試想一下,你回家,在電梯進(jìn)入,門正在關(guān)閉......,突然你的鄰居出現(xiàn)在大廳,并試圖跳上電梯。要有禮貌!并打開大門,他說:你去抖動(dòng)電梯離去??紤]到同樣的情況可以與第三人再次發(fā)生,等等...大概推遲起飛幾分鐘。
油門:將其視為閥門,它調(diào)節(jié)執(zhí)行流程。我們能確定的時(shí)間函數(shù)可以在一定時(shí)間內(nèi)被稱為最大數(shù)。所以在電梯比喻..你有足夠的禮貌,讓在持續(xù)10秒的人,但一旦延遲的推移,你必須去!
添加回答
舉報(bào)