MST

星途 面试题库

面试题:JavaScript 异步迭代器的自定义迭代协议扩展

在 JavaScript 中,扩展异步迭代器协议,使其支持一个新的方法 `batchNext`,该方法可以一次获取多个异步生成的值(数量由参数指定),并以数组形式返回。例如,`batchNext(3)` 会一次性返回接下来的 3 个异步生成的值。请详细说明如何实现这个自定义扩展,包括如何确保与现有的异步迭代器接口(如 `for - await...of`)兼容。
14.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 定义扩展的异步迭代器类
    • 首先,我们需要创建一个新的类来扩展现有的异步迭代器行为。这个类将包含新的 batchNext 方法。
    class BatchAsyncIterator {
        constructor(asyncIterator) {
            this.asyncIterator = asyncIterator;
        }
        async next() {
            return this.asyncIterator.next();
        }
        async batchNext(count) {
            const results = [];
            for (let i = 0; i < count; i++) {
                const { value, done } = await this.asyncIterator.next();
                if (done) {
                    break;
                }
                results.push(value);
            }
            return results;
        }
    }
    
  2. 创建异步生成器函数并返回扩展的异步迭代器
    • 我们可以创建一个普通的异步生成器函数,然后在外部将其包装成我们扩展的异步迭代器。
    async function* myAsyncGenerator() {
        yield 1;
        yield 2;
        yield 3;
        yield 4;
        yield 5;
    }
    const asyncGen = myAsyncGenerator();
    const batchAsyncIter = new BatchAsyncIterator(asyncGen);
    
  3. 确保与 for - await...of 兼容
    • 由于 for - await...of 循环是基于异步迭代器协议工作的,而我们的 BatchAsyncIterator 类实现了标准的 next 方法(它直接调用了底层异步迭代器的 next 方法),所以它天然与 for - await...of 兼容。
    (async () => {
        for await (const value of batchAsyncIter) {
            console.log(value);
        }
    })();
    
    • 同时,我们仍然可以使用新的 batchNext 方法来批量获取值。
    (async () => {
        const batch = await batchAsyncIter.batchNext(3);
        console.log(batch);
    })();
    

这样就实现了对异步迭代器协议的扩展,使其支持 batchNext 方法,并且保持了与现有的 for - await...of 等异步迭代器接口的兼容性。