MST
星途 面试题库

面试题:JavaScript异步生成器与并发控制

假设有一组大量的异步任务(例如100个网络请求),每个任务返回一个Promise。要求使用异步生成器和相关技术实现并发控制,每次最多同时执行5个任务,并且按任务提交的顺序输出结果。请详细阐述设计思路并编写完整的JavaScript代码。
45.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 异步生成器:使用异步生成器函数来生成任务队列。
  2. 并发控制:利用Promiseasync/await来控制并发数量,通过维护一个任务数组,确保同时执行的任务不超过5个。
  3. 按序输出:通过async/await确保每个任务按顺序完成并输出结果。

JavaScript代码

function asyncTask(id) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`Task ${id} completed`);
            resolve(id);
        }, Math.floor(Math.random() * 1000));
    });
}

async function* taskGenerator() {
    for (let i = 1; i <= 100; i++) {
        yield asyncTask(i);
    }
}

async function executeTasks() {
    const tasks = [];
    const results = [];
    const concurrency = 5;
    const gen = taskGenerator();

    // 启动初始任务
    for (let i = 0; i < concurrency; i++) {
        const task = gen.next();
        if (!task.done) {
            tasks.push(task.value.then(result => {
                results.push(result);
                return result;
            }));
        }
    }

    while (tasks.length > 0) {
        const completedTask = await Promise.race(tasks);
        tasks.splice(tasks.indexOf(completedTask), 1);
        const nextTask = gen.next();
        if (!nextTask.done) {
            tasks.push(nextTask.value.then(result => {
                results.push(result);
                return result;
            }));
        }
    }

    console.log("Final results in order:", results);
    return results;
}

executeTasks();