面试题答案
一键面试设计思路
- 任务分割:将大的类数组对象分割成多个小的子数组,以减少单个任务处理的数据量。
- 并发控制:使用一个队列来管理任务,并设置最大并发数,避免同时执行过多任务导致内存溢出或性能瓶颈。
- 异步处理:利用
async/await
或者Promise
来处理异步计算任务,确保代码的异步执行和顺序控制。
核心代码示例
// 模拟复杂的异步计算任务
function complexAsyncTask(data) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(data * 2); // 模拟计算结果
}, 100);
});
}
async function processLargeArray(largeArray, maxConcurrency) {
const result = [];
const taskQueue = [];
const executeTask = async () => {
const task = taskQueue.shift();
if (task) {
const res = await complexAsyncTask(task);
result.push(res);
executeTask();
}
};
for (const item of largeArray) {
taskQueue.push(item);
if (taskQueue.length >= maxConcurrency) {
await executeTask();
}
}
// 处理剩余任务
while (taskQueue.length > 0) {
await executeTask();
}
return result;
}
// 使用示例
const largeArray = Array.from({ length: 1000 }, (_, i) => i + 1);
const maxConcurrency = 10;
processLargeArray(largeArray, maxConcurrency).then((res) => {
console.log(res);
});
上述代码实现了对大数组的异步任务处理,通过控制并发数避免性能问题。具体解释如下:
complexAsyncTask
函数模拟了复杂的异步计算任务。processLargeArray
函数接受大数组和最大并发数作为参数。- 使用
taskQueue
来存储任务,executeTask
函数从队列中取出任务并执行,利用async/await
确保任务顺序执行。 - 遍历大数组,将任务加入队列,当队列长度达到最大并发数时,执行任务直到队列长度小于最大并发数。
- 遍历结束后,处理队列中剩余的任务。
- 最后返回处理结果。