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

JavaScript中for of循环遇await是否每次迭代暂停?文章内容存疑

关于for-of循环结合async/await的执行逻辑疑问

我在某教程中看到,for-of循环搭配async/await时,每次迭代都会等待前一次完成后再开始,但自己测试后发现所有Promise会同时启动,循环并没有在每次迭代时暂停,只是迭代内的代码会等待Promise结果。请问该教程的说法是否存在错误?

教程截图:
教程中关于for-of循环与async/await的描述

我的测试代码:

const promises = [];

for (let i = 1; i < 4; i++) {
  promises.push(
    new Promise((res, _) => {
      setTimeout(async () => {
        res(i);
      }, 2000);
    })
  );
}

(async () => {
  for (let promise of promises) {
    const r = await promise;
    console.log(r);
  }
})();

问题分析

教程的说法并不存在错误,但它隐含了一个关键前提:Promise是在for-of循环的迭代过程中创建的。

你的测试代码和教程场景的核心差异在于Promise的创建时机:

  • 你的代码里,所有Promise是在第一个普通for循环中提前创建并启动的——new Promise执行的瞬间,内部的setTimeout就开始计时了,因此三个Promise会同时进入等待状态,2秒后一起完成。后续的for-of循环只是依次等待这些已经在运行的Promise结果,自然不会暂停迭代的启动逻辑。
  • 而教程描述的场景,应该是在for-of循环内部创建Promise,示例代码类似:
    (async () => {
      for (let i = 1; i < 4; i++) {
        // 每次迭代才创建并启动Promise
        const promise = new Promise((res) => {
          setTimeout(() => res(i), 2000);
        });
        const r = await promise;
        console.log(r);
      }
    })();
    
    这种情况下,每次迭代都会先创建Promise并启动计时,等待它完成后再进入下一次迭代,完全符合教程所说的“每次迭代都会等待”的逻辑。

结论

教程的描述是准确的,只是没有明确说明“Promise在迭代内创建”这个前提。你的测试代码因为提前初始化了所有Promise,才出现了“同时执行”的现象,属于场景差异导致的误解。

内容的提问来源于stack exchange,提问作者Anton Mendelson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:55:18