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

如何在生成器函数中结合Promise与setTimeout创建异步生成器?

问题分析与修复

先梳理你代码里的核心问题:

  • 变量名笔误:定义的数组是targets,但代码里误用了targetArray,直接导致第一个值无法正常输出
  • 异步生成器逻辑缺失:只返回了一次Promise,没有循环遍历数组,自然只能处理第一个元素
  • for await...of用法错误:不需要手动调用generator.next(),这个循环会自动迭代生成器,而且你同时创建了两个生成器实例,逻辑完全混乱
  • setTimeout语法错误:延迟时间的参数位置写错了,且resolve里不该套console.log(它返回undefined,等于没传有效结果)
  • 全局变量索引隐患:用全局变量j控制索引容易引发状态混乱,不如在生成器内部处理

修复后的代码

// 延迟时间数组(毫秒)
const timeArray = [6, 68, 51, 41, 94, 65, 47, 85, 76, 136];
// 要输出的目标值数组
const targets = [9, 10, 8, 7, 9, 7, 7, 9, 9, 7];

async function* generateSequence() {
  // 遍历数组索引,确保每个元素都被处理
  for (let i = 0; i < targets.length; i++) {
    // 每个迭代返回一个Promise,等待对应延迟后resolve目标值
    yield new Promise((resolve) => {
      setTimeout(() => {
        resolve(targets[i]);
      }, timeArray[i]);
    });
  }
}

(async function main() {
  // for await...of自动按顺序等待每个Promise完成,输出结果
  for await (const result of generateSequence()) {
    console.log(result);
  }
})();

逻辑说明

  1. 异步生成器内部用for循环遍历数组,确保每一组targets和timeArray的对应元素都被处理
  2. 每个迭代返回的Promise会等待对应timeArray的延迟时间,然后返回targets里的对应值
  3. for await...of会自动按顺序等待每个Promise完成,拿到结果后输出,直到生成器迭代完毕

这样就能实现你预期的效果:按顺序等待对应延迟,依次输出targets数组的每个元素。

内容的提问来源于stack exchange,提问作者Chris Young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:10:42