首先,我们需要一个简单的Promise限速函数,如下所示:
function rateLimit(promiseGenerator, time) { let queue = []; return function () { const args = arguments; const resolver = (resolve, reject) => { queue.push({ resolve, reject }); }; queue.push({ args, resolver }); return new Promise(resolver).then(promiseGenerator); }; }
接下来,我们可以使用该函数封装Promise.allSettled(),实现限速功能,如下所示:
function rateLimitedAllSettled(promises, maxRequests, time) { const rateLimited = rateLimit(() => Promise.allSettled(promises), time); const results = [];
const nextRequest = () => { if (promises.length) { const promise = promises.shift(); promise .then((result) => { results.push({ status: "fulfilled", value: result }); }) .catch((error) => { results.push({ status: "rejected", reason: error }); }) .finally(() => { nextRequest(); }); } };
while (promises.length < maxRequests) { nextRequest(); }
return rateLimited().then(() => results); }
该函数的使用方式与Promise.allSettled()相同,但添加了额外的限速参数。例如:
rateLimitedAllSettled([promise1, promise2, promise3], 2, 1000).then((results) => { // 处理返回结果 });
这将限制每一秒内只执行两个Promise,并在所有Promise都完成后返回结果数组。