如何在生成器函数中结合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); } })();
逻辑说明
- 异步生成器内部用
for循环遍历数组,确保每一组targets和timeArray的对应元素都被处理 - 每个迭代返回的Promise会等待对应
timeArray的延迟时间,然后返回targets里的对应值 for await...of会自动按顺序等待每个Promise完成,拿到结果后输出,直到生成器迭代完毕
这样就能实现你预期的效果:按顺序等待对应延迟,依次输出targets数组的每个元素。
内容的提问来源于stack exchange,提问作者Chris Young
相关产品推荐
相关产品推荐

