MST

星途 面试题库

面试题:JavaScript迭代器在异步操作中的深度应用

在JavaScript中,假设有一系列异步任务(可以用setTimeout模拟),每个任务的执行时间不同。请利用迭代器和异步操作(如async/await)实现一个控制流,按顺序依次执行这些任务,并且在所有任务完成后返回一个汇总结果。解释你如何处理迭代器在异步环境下的暂停、恢复和错误处理。
40.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function asyncTask(duration, value) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(value);
        }, duration);
    });
}

function* taskGenerator() {
    yield asyncTask(1000, 'Task 1');
    yield asyncTask(2000, 'Task 2');
    yield asyncTask(1500, 'Task 3');
}

async function executeTasks() {
    const tasks = taskGenerator();
    let result = [];
    let task;
    try {
        while (!(task = tasks.next()).done) {
            const value = await task.value;
            result.push(value);
        }
    } catch (error) {
        console.error('Error occurred:', error);
        return;
    }
    return result;
}

executeTasks().then(finalResult => {
    console.log('All tasks completed. Result:', finalResult);
});

迭代器在异步环境下的处理

  1. 暂停:在taskGenerator函数中,yield关键字使得迭代器暂停执行。当执行到yield asyncTask(...)时,迭代器暂停,将asyncTask返回的Promise作为next方法返回对象的value属性值。
  2. 恢复:在executeTasks函数的while循环中,使用await等待Promise解决。当Promise解决后,await表达式恢复执行,将Promise的解决值赋给value,然后继续执行循环体的后续部分,通过tasks.next()恢复迭代器的执行,获取下一个任务。
  3. 错误处理:在executeTasks函数中,使用try...catch块捕获在异步任务执行过程中可能抛出的错误。如果任何一个asyncTask抛出错误,catch块将捕获该错误,打印错误信息并提前结束任务执行,避免后续任务继续执行。