2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
您可以每分鐘發(fā)送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因為它會在延遲后執(zhí)行每個函數(shù)調用,而_.debounce將多個調用組合為一個調用。看到這個文章從鏈接的文檔
防抖動:可以將其視為“將多個事件組合在一起”。想象您回家,進入電梯,門正在關閉……突然間,您的鄰居出現(xiàn)在大廳里,試圖跳上電梯。要有禮貌!并為他打開門:您正在取消電梯的離開。考慮到第三人可能再次發(fā)生相同的情況,依此類推……可能會將出發(fā)時間延遲了幾分鐘。
油門:將其視為閥門,它調節(jié)執(zhí)行流程。我們可以確定某個函數(shù)在特定時間內可以被調用的最大次數(shù)。因此,在電梯類比中,您很有禮貌地允許人們進入10秒鐘,但是一旦延遲過去,您就必須走!
添加回答
舉報