Overview
Implement limitRate(fn, maxCalls, interval) that limits fn to at most maxCalls invocations per interval ms. Extra calls are queued.
Examples
const limited = limitRate(apiFetch, 3, 1000); // At most 3 calls per second, rest queued
Solution
Reveal solution
function limitRate(fn, maxCalls, interval) {
const queue = [];
let calls = 0;
let timer = null;
function process() {
while (calls < maxCalls && queue.length > 0) {
calls++;
const { args, resolve } = queue.shift();
resolve(fn(...args));
}
if (!timer && calls > 0) {
timer = setTimeout(() => { calls = 0; timer = null; process(); }, interval);
}
}
return function(...args) {
return new Promise(resolve => { queue.push({ args, resolve }); process(); });
};
}limit-rate.js
Limit Rate
mediumcodingJavaScriptFunctions
Overview
Implement limitRate(fn, maxCalls, interval) that limits fn to at most maxCalls invocations per interval ms. Extra calls are queued.
Examples
const limited = limitRate(apiFetch, 3, 1000); // At most 3 calls per second, rest queued
Solution
Reveal solution
function limitRate(fn, maxCalls, interval) {
const queue = [];
let calls = 0;
let timer = null;
function process() {
while (calls < maxCalls && queue.length > 0) {
calls++;
const { args, resolve } = queue.shift();
resolve(fn(...args));
}
if (!timer && calls > 0) {
timer = setTimeout(() => { calls = 0; timer = null; process(); }, interval);
}
}
return function(...args) {
return new Promise(resolve => { queue.push({ args, resolve }); process(); });
};
}NameTopicDifficulty
103 of 103 problems