面试题答案
一键面试- 定义扩展的异步迭代器类:
- 首先,我们需要创建一个新的类来扩展现有的异步迭代器行为。这个类将包含新的
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; } }
- 首先,我们需要创建一个新的类来扩展现有的异步迭代器行为。这个类将包含新的
- 创建异步生成器函数并返回扩展的异步迭代器:
- 我们可以创建一个普通的异步生成器函数,然后在外部将其包装成我们扩展的异步迭代器。
async function* myAsyncGenerator() { yield 1; yield 2; yield 3; yield 4; yield 5; } const asyncGen = myAsyncGenerator(); const batchAsyncIter = new BatchAsyncIterator(asyncGen);
- 确保与
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
等异步迭代器接口的兼容性。