MST

星途 面试题库

面试题:TypeScript异步操作的复杂类型处理与性能优化

在一个前端项目中,有多个异步任务,这些任务之间存在依赖关系,有些任务需要并发执行,有些需要顺序执行。例如,任务A先执行,获取用户ID,然后任务B和任务C基于用户ID并发执行,分别获取用户详情和用户权限,最后任务D基于任务B和C的结果生成报告。请使用TypeScript编写代码实现该流程,要求合理处理类型、错误,并且考虑性能优化,如避免不必要的等待。
37.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 模拟异步任务函数
function taskA(): Promise<number> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(1); // 模拟获取到用户ID
        }, 1000);
    });
}

function taskB(userId: number): Promise<string> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(`用户详情 - ${userId}`);
        }, 1000);
    });
}

function taskC(userId: number): Promise<string> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(`用户权限 - ${userId}`);
        }, 1000);
    });
}

function taskD(userDetail: string, userPermission: string): Promise<string> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(`报告:${userDetail},${userPermission}`);
        }, 1000);
    });
}

async function main() {
    try {
        const userId = await taskA();
        const [userDetail, userPermission] = await Promise.all([taskB(userId), taskC(userId)]);
        const report = await taskD(userDetail, userPermission);
        console.log(report);
    } catch (error) {
        console.error('发生错误:', error);
    }
}

main();
  1. 任务函数定义
    • taskA 模拟获取用户ID的异步任务,返回一个 Promise,1秒后 resolve 出用户ID。
    • taskBtaskC 基于用户ID分别获取用户详情和用户权限,同样返回 Promise,1秒后 resolve 出相应结果。
    • taskD 基于 taskBtaskC 的结果生成报告,1秒后 resolve 出报告内容。
  2. main 函数
    • 使用 async/await 语法来处理异步流程。
    • 首先通过 await taskA() 获取用户ID。
    • 然后使用 Promise.all 并发执行 taskBtaskC,等待这两个任务都完成,获取用户详情和用户权限。
    • 最后执行 taskD 生成报告。
    • 使用 try/catch 块捕获在异步任务执行过程中可能出现的错误并进行处理。这样既合理处理了任务间的依赖关系、类型和错误,又通过 Promise.all 实现了并发任务的性能优化,避免了不必要的等待。