MST

星途 面试题库

面试题:JavaScript迭代器在异步数据处理场景下的应用

在JavaScript中,当处理异步数据(比如通过Promise获取的数据)时,如何利用迭代器来实现数据的顺序处理或者并发处理?请结合具体代码示例,说明如何使用生成器函数和迭代器来管理异步操作序列。
12.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

顺序处理异步数据

在JavaScript中,可以使用生成器函数和迭代器来实现异步数据的顺序处理。生成器函数是一种返回迭代器的函数,它可以暂停和恢复执行,这使得我们可以很好地控制异步操作的流程。

下面是一个使用生成器函数和迭代器顺序处理异步数据的示例:

function asyncTask1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('Task 1 completed');
            resolve('Result of Task 1');
        }, 1000);
    });
}

function asyncTask2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('Task 2 completed');
            resolve('Result of Task 2');
        }, 1000);
    });
}

function asyncTask3() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('Task 3 completed');
            resolve('Result of Task 3');
        }, 1000);
    });
}

function* asyncTasksGenerator() {
    const result1 = yield asyncTask1();
    const result2 = yield asyncTask2();
    const result3 = yield asyncTask3();
    return [result1, result2, result3];
}

function runAsyncTasks() {
    const generator = asyncTasksGenerator();
    let result;
    function handleNext() {
        const { value, done } = generator.next(result);
        if (done) {
            console.log('All tasks completed:', value);
            return;
        }
        Promise.resolve(value)
          .then((res) => {
                result = res;
                handleNext();
            });
    }
    handleNext();
}

runAsyncTasks();

并发处理异步数据

对于并发处理异步数据,我们可以使用Promise.all结合生成器函数来实现。Promise.all接受一个Promise数组,并返回一个新的Promise,只有当所有的Promise都解决时,这个新的Promise才会解决。

以下是一个并发处理异步数据的示例:

function asyncTask1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('Task 1 completed');
            resolve('Result of Task 1');
        }, 1000);
    });
}

function asyncTask2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('Task 2 completed');
            resolve('Result of Task 2');
        }, 1000);
    });
}

function asyncTask3() {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('Task 3 completed');
            resolve('Result of Task 3');
        }, 1000);
    });
}

function* asyncTasksGenerator() {
    const tasks = [asyncTask1(), asyncTask2(), asyncTask3()];
    const results = yield Promise.all(tasks);
    return results;
}

function runAsyncTasks() {
    const generator = asyncTasksGenerator();
    const { value, done } = generator.next();
    if (done) {
        console.log('All tasks completed:', value);
    } else {
        Promise.resolve(value)
          .then((res) => {
                const finalResult = generator.next(res).value;
                console.log('All tasks completed:', finalResult);
            });
    }
}

runAsyncTasks();

在上述代码中,asyncTasksGenerator生成器函数中,使用Promise.all来并发执行多个异步任务。runAsyncTasks函数负责启动生成器并处理Promise的结果。