async function executeTasks() {
try {
// 执行任务A
const resultA = await taskA();
// 任务A成功后执行任务B
const resultB = await taskB(resultA);
// 任务B成功后执行任务C
const resultC = await taskC(resultB);
return resultC;
} catch (error) {
// 捕获任务A、B、C中任何一个任务的错误
console.error('任务执行失败:', error);
}
}
// 模拟任务A
function taskA() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// 这里可以根据实际逻辑决定是resolve还是reject
resolve('任务A的结果');
}, 1000);
});
}
// 模拟任务B
function taskB(resultA) {
return new Promise((resolve, reject) => {
setTimeout(() => {
// 这里可以根据实际逻辑决定是resolve还是reject
resolve(`任务B基于任务A结果: ${resultA}`);
}, 1000);
});
}
// 模拟任务C
function taskC(resultB) {
return new Promise((resolve, reject) => {
setTimeout(() => {
// 这里可以根据实际逻辑决定是resolve还是reject
resolve(`任务C基于任务B结果: ${resultB}`);
}, 1000);
});
}
executeTasks();
await表达式确保任务顺序执行的原理
- 暂停异步函数执行:当遇到
await
关键字时,async
函数会暂停执行,直到其等待的Promise
被解决(resolved)或被拒绝(rejected)。
- 等待Promise解决:
await
会阻塞其后代码的执行,直到await
的Promise
完成。这就保证了任务按照顺序执行,例如只有当taskA
的Promise
解决后,await taskA()
才会返回结果,进而继续执行await taskB(resultA)
,以此类推。
处理任务A失败避免后续任务执行
- 使用try - catch块:在
async
函数内部使用try - catch
块来捕获await
表达式抛出的错误。如果taskA
失败(其Promise
被reject
),await taskA()
会抛出错误,这个错误会被catch
块捕获。在catch
块中可以进行错误处理,例如记录错误日志等,并且由于async
函数已经暂停执行,后续的taskB
和taskC
不会被执行。