编写递归异步生成器时,异步生成器中yield*的等效语法如何实现?
异步生成器中使用
yield*的语法实现 异步生成器中同样可以使用yield*来批量产出另一个异步(或同步)生成器/迭代器的所有值,语法和同步生成器几乎一致,唯一区别在于异步生成器返回的是异步迭代器,必须用异步方式消费。
基础示例
先定义异步生成器,yield*的用法和同步完全相同:
async function* A() { yield 1; yield 2; yield 3; } async function* B() { // 批量产出A的所有值,执行两次 yield* A(); yield* A(); }
由于异步迭代器无法像同步迭代器那样直接用[...iterator]获取值,需要用for await...of循环或异步函数收集结果:
// 封装函数收集异步迭代器的所有值 async function collectAsyncValues(iterator) { const result = []; for await (const value of iterator) { result.push(value); } return result; } // 调用并输出结果 collectAsyncValues(B()).then(arr => { console.log(arr); // 输出: [1, 2, 3, 1, 2, 3] });
递归异步生成器示例
如果是递归场景,yield*同样适用,比如遍历嵌套的异步结构:
async function* recursiveGenerator(nestedData) { if (Array.isArray(nestedData)) { // 递归遍历数组每一项 for (const item of nestedData) { yield* recursiveGenerator(item); } } else if (typeof nestedData === 'object' && nestedData !== null) { // 递归遍历对象属性 for (const key of Object.keys(nestedData)) { yield* recursiveGenerator(nestedData[key]); } } else { // 模拟异步操作(比如从API获取数据) await new Promise(resolve => setTimeout(resolve, 50)); yield nestedData; } } // 消费递归异步生成器 async function runRecursive() { const testData = [1, [2, { id: 3 }], 4]; for await (const val of recursiveGenerator(testData)) { console.log(val); // 依次输出: 1, 2, 3, 4 } } runRecursive();
内容的提问来源于stack exchange,提问作者Codesmith
相关产品推荐
相关产品推荐

