// 模拟异步任务函数,成功时返回结果,失败时抛出错误
function asyncTask1(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
Math.random() > 0.5? resolve('Task 1 Success') : reject(new Error('Task 1 Error'));
}, 1000);
});
}
function asyncTask2(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
Math.random() > 0.5? resolve('Task 2 Success') : reject(new Error('Task 2 Error'));
}, 1500);
});
}
function asyncTask3(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
Math.random() > 0.5? resolve('Task 3 Success') : reject(new Error('Task 3 Error'));
}, 2000);
});
}
// 并发执行多个异步任务并处理错误
async function concurrentTasks() {
try {
const [result1, result2, result3] = await Promise.all([asyncTask1(), asyncTask2(), asyncTask3()]);
console.log(result1, result2, result3);
} catch (error) {
if (error instanceof Error) {
console.error('Concurrent Task Error:', error.message);
} else {
console.error('Unexpected Error:', error);
}
}
}
// 链式调用异步任务并处理错误
async function chainedTasks() {
try {
const result1 = await asyncTask1();
console.log(result1);
const result2 = await asyncTask2();
console.log(result2);
const result3 = await asyncTask3();
console.log(result3);
} catch (error) {
if (error instanceof Error) {
console.error('Chained Task Error:', error.message);
} else {
console.error('Unexpected Error:', error);
}
}
}
// 调用并发任务
concurrentTasks();
// 调用链式任务
chainedTasks();
代码逻辑解释
- 异步任务函数:
asyncTask1
、asyncTask2
和 asyncTask3
模拟了实际的异步任务,它们通过 setTimeout
模拟了异步操作,并以一定概率成功或失败。成功时通过 resolve
返回结果,失败时通过 reject
抛出错误。
- 并发任务处理:在
concurrentTasks
函数中,使用 Promise.all
并发执行三个异步任务。await Promise.all([asyncTask1(), asyncTask2(), asyncTask3()])
等待所有任务完成,并将结果以数组形式返回。如果其中任何一个任务失败,Promise.all
会立即拒绝,并抛出该任务的错误。
- 链式任务处理:在
chainedTasks
函数中,通过 await
依次调用 asyncTask1
、asyncTask2
和 asyncTask3
,形成链式调用。只有前一个任务成功完成,才会执行下一个任务。如果某个任务失败,后续任务将不会执行,await
会捕获并抛出错误。
错误处理策略
try...catch
块:在 concurrentTasks
和 chainedTasks
函数中,使用 try...catch
块捕获可能出现的错误。这样可以确保在异步操作出现错误时,不会出现未处理的 Promise 拒绝。
- 类型检查:在
catch
块中,使用 instanceof Error
进行类型检查,确保捕获的错误是 Error
类型。这样可以更准确地处理错误,避免在处理非 Error
类型数据时出现意外情况。对于非 Error
类型的错误,也进行了相应的日志记录,以帮助调试。通过这种方式,利用 TypeScript 的类型系统确保了错误处理的健壮性和准确性。