MST

星途 面试题库

面试题:JavaScript await 表达式在复杂异步流程控制中的应用

假设有一系列异步任务,任务 B 需要等待任务 A 完成后开始,任务 C 需要等待任务 B 完成后开始,且每个任务都返回一个 Promise。请使用 async/await 语法编写代码实现这个异步流程,并说明在这个过程中 await 表达式是如何确保任务顺序执行的。同时,如果任务 A 失败,如何优雅地处理错误,避免后续任务继续执行。
41.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
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表达式确保任务顺序执行的原理

  1. 暂停异步函数执行:当遇到await关键字时,async函数会暂停执行,直到其等待的Promise被解决(resolved)或被拒绝(rejected)。
  2. 等待Promise解决await会阻塞其后代码的执行,直到awaitPromise完成。这就保证了任务按照顺序执行,例如只有当taskAPromise解决后,await taskA()才会返回结果,进而继续执行await taskB(resultA),以此类推。

处理任务A失败避免后续任务执行

  1. 使用try - catch块:在async函数内部使用try - catch块来捕获await表达式抛出的错误。如果taskA失败(其Promisereject),await taskA()会抛出错误,这个错误会被catch块捕获。在catch块中可以进行错误处理,例如记录错误日志等,并且由于async函数已经暂停执行,后续的taskBtaskC不会被执行。