MST
星途 面试题库

面试题:JavaScript异步迭代性能优化之实践

假设你有一个包含大量异步任务的数组,每个任务返回一个`Promise`,并且你希望在保证一定并发数的情况下尽快完成所有任务并优化性能。请使用JavaScript实现一个函数来处理这种场景,并解释你这样实现的性能优化点。
13.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function asyncTaskRunner(tasks, concurrency) {
    return new Promise((resolve, reject) => {
        let completedCount = 0;
        const results = [];
        const taskQueue = tasks.slice();
        const runningTasks = [];

        function runNextTask() {
            while (runningTasks.length < concurrency && taskQueue.length > 0) {
                const task = taskQueue.shift();
                const promise = task();
                runningTasks.push(promise);
                promise
                  .then(result => {
                        results.push(result);
                        completedCount++;
                        runningTasks.splice(runningTasks.indexOf(promise), 1);
                        if (completedCount === tasks.length) {
                            resolve(results);
                        } else {
                            runNextTask();
                        }
                    })
                  .catch(err => {
                        reject(err);
                    });
            }

            if (completedCount === tasks.length) {
                resolve(results);
            }
        }

        runNextTask();
    });
}

性能优化点解释:

  1. 并发控制:通过concurrency参数限制同时执行的任务数量,避免过多任务同时执行导致资源耗尽,比如内存不足或者CPU过载,保证系统稳定运行。
  2. 任务队列:使用数组taskQueue来存储尚未执行的任务,通过shift方法依次取出任务执行,确保所有任务都能被执行到。
  3. 动态任务调度:当有任务完成时,立即从任务队列中取出新任务执行(runNextTask函数),这样可以充分利用系统资源,尽快完成所有任务。
  4. 结果收集:使用数组results来存储每个任务的执行结果,方便在所有任务完成后统一返回。
  5. 错误处理:一旦有任何任务抛出错误,立即通过reject终止整个任务流程,避免无效的任务继续执行,提高性能和可靠性。