MST

星途 面试题库

面试题:TypeScript中async函数的并发与顺序执行优化

假设有一组异步任务(使用async函数定义),要求你实现两种情况:1. 所有任务并发执行,并且在所有任务完成后返回结果。2. 任务顺序执行,前一个任务完成后再执行下一个,最后返回所有任务的结果。请用TypeScript代码实现这两种情况,并解释其原理。
17.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

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的解决值。这样,每个任务会在前一个任务完成后才开始执行,最后将所有任务的结果收集到一个数组中返回。