JavaScript中for of循环遇await是否每次迭代暂停?文章内容存疑
关于for-of循环结合async/await的执行逻辑疑问
我在某教程中看到,for-of循环搭配async/await时,每次迭代都会等待前一次完成后再开始,但自己测试后发现所有Promise会同时启动,循环并没有在每次迭代时暂停,只是迭代内的代码会等待Promise结果。请问该教程的说法是否存在错误?
教程截图:
我的测试代码:
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,示例代码类似:
这种情况下,每次迭代都会先创建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,才出现了“同时执行”的现象,属于场景差异导致的误解。
内容的提问来源于stack exchange,提问作者Anton Mendelson
相关产品推荐
相关产品推荐

