You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写递归异步生成器时,异步生成器中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:18