面试题答案
一键面试1. 所有任务并发执行,并且在所有任务完成后返回结果
async function concurrentTasks(tasks: (() => Promise<any>)[]): Promise<any[]> {
return Promise.all(tasks.map(task => task()));
}
// 示例使用
const task1 = async () => {
await new Promise(resolve => setTimeout(resolve, 1000));
return 'Task 1 result';
};
const task2 = async () => {
await new Promise(resolve => setTimeout(resolve, 500));
return 'Task 2 result';
};
const tasks = [task1, task2];
concurrentTasks(tasks).then(results => {
console.log(results);
});
原理:Promise.all
方法接受一个Promise数组作为参数,它会并行执行这些Promise。当所有的Promise都已解决(resolved),Promise.all
返回的Promise才会解决,并以数组的形式返回每个Promise的解决值。如果任何一个Promise被拒绝(rejected),Promise.all
返回的Promise会立即被拒绝,并传递第一个被拒绝的Promise的拒绝原因。
2. 任务顺序执行,前一个任务完成后再执行下一个,最后返回所有任务的结果
async function sequentialTasks(tasks: (() => Promise<any>)[]): Promise<any[]> {
let results: any[] = [];
for (const task of tasks) {
const result = await task();
results.push(result);
}
return results;
}
// 示例使用
const task1 = async () => {
await new Promise(resolve => setTimeout(resolve, 1000));
return 'Task 1 result';
};
const task2 = async () => {
await new Promise(resolve => setTimeout(resolve, 500));
return 'Task 2 result';
};
const tasks = [task1, task2];
sequentialTasks(tasks).then(results => {
console.log(results);
});
原理:通过for...of
循环依次执行每个任务。await
关键字会暂停当前的异步函数,直到被等待的Promise解决,然后继续执行并返回Promise的解决值。这样,每个任务会在前一个任务完成后才开始执行,最后将所有任务的结果收集到一个数组中返回。