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秒的人,但一旦延迟的推移,你必须去!
添加回答
举报