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