以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - JavaScript 代码题
92. Promise节流
解答:
这道题需要通过手动创建一个任务队列,来限制同时进行的 API 请求数量。具体实现如下:
function throttlePromises(promises, maxConcurrency) { let index = 0; // 记录已经发起请求的 promise 的索引 let activeCount = 0; // 记录正在进行中的请求数量 let results = new Array(promises.length); // 用于保存最终结果的数组 // 定义一个递归函数,用于处理请求队列中的下一个任务 function processNext() { // 如果所有任务已经完成,则直接返回包含结果的 Promise if (index === promises.length && activeCount === 0) { return Promise.resolve(results); } // 如果可以执行新的任务,则执行 if (index < promises.length && activeCount < maxConcurrency) { const currentIndex = index++; activeCount++; const currentPromise = promises[currentIndex](); // 将任务 promise 的结果放入结果数组中 currentPromise .then((result) => { results[currentIndex] = result; }) .catch((error) => { results[currentIndex] = error; }) .finally(() => { activeCount--; }); // 递归调用 processNext(),进入下一轮处理 return processNext(); } // 如果不能执行新的任务,则等待之前的任务完成后再执行 return new Promise((resolve) => { setTimeout(() => { resolve(processNext()); }, 10); }); } // 调用 processNext(),返回 Promise return processNext();}
上述代码中,通过一个递归的 processNext()
函数来处理任务队列中的下一个任务,确保最多只有 maxConcurrency
个任务同时进行。如果目前正在进行的请求数小于 maxConcurrency
,并且还有未发起的请求,则会取出下一个未执行的 API 请求并立即执行。
如果已经发起的请求达到了 maxConcurrency
的上限,则等待 10 毫秒后再次调用 processNext()
,直到有请求完成之后才继续进行下一个任务。
最后,使用 throttlePromises()
函数即可在限制请求数量的情况下获取所有结果:
throttlePromises(callApis, 5) .then((data) => { console.log(data); }) .catch((error) => { console.error(error); });