class RequestThrottler {
constructor(maxRequestsPerInterval, intervalMs) {
this.maxRequestsPerInterval = maxRequestsPerInterval;
this.intervalMs = intervalMs;
this.requests = [];
this.nextRun = Date.now() + intervalMs;
}
/**
* Schedules a request to be made.
* @param {function} requestFunc - The function to execute for the request. Should return a Promise.
* @returns {Promise} - A promise that resolves when the request is completed.
*/
scheduleRequest(requestFunc) {
return new Promise((resolve, reject) => {
this.requests.push({ func: requestFunc, resolve, reject });
this.processRequests();
});
}
/**
* Processes the pending requests.
*/
processRequests() {
const now = Date.now();
if (now >= this.nextRun) {
this.nextRun = now + this.intervalMs;
while (this.requests.length > 0) {
const request = this.requests.shift();
try {
const result = request.func();
request.resolve(result);
} catch (error) {
request.reject(error);
}
}
}
}
}
// Example usage:
// const throttler = new RequestThrottler(2, 1000); // Allow 2 requests per second
// const request1 = () => {
// return new Promise(resolve => setTimeout(() => {resolve("Response 1");}, 500));
// };
// const request2 = () => {
// return new Promise(resolve => setTimeout(() => {resolve("Response 2");}, 800));
// };
// const request3 = () => {
// return new Promise(resolve => setTimeout(() => {resolve("Response 3");}, 300));
// };
// throttler.scheduleRequest(request1)
// .then(result => console.log("Request 1:", result))
// .catch(error => console.error("Request 1 error:", error));
// throttler.scheduleRequest(request2)
// .then(result => console.log("Request 2:", result))
// .catch(error => console.error("Request 2 error:", error));
// throttler.scheduleRequest(request3)
// .then(result => console.log("Request 3:", result))
// .catch(error => console.error("Request 3 error:", error));
Add your comment