为何循环未等待async/await完成就继续执行?
问题分析与解决方案
问题原因
- 你用了立即执行的async箭头函数,这个函数会开启独立的异步任务,外层for循环不会等待它执行完成就进入下一次迭代,导致所有
function2调用并行执行,没有按顺序等待。 indexAdd变量定义在箭头函数内部,外层循环无法访问,代码里index = index + indexAdd这一行会直接报错(indexAdd未定义)。- 你之前误以为不能在
function1里直接用await,但function1本身已经被声明为async函数,完全可以直接在内部使用await,之前的报错大概率是其他语法问题(比如漏写this.或者代码结构错误)。
修复后的代码
async function1() { let index = 0; for (const row of this.submissions) { if (row.EXCEL_CHECK === 1) { // 直接在async函数内await function2,无需额外的立即执行函数 const indexAdd = await this.function2(index); index += indexAdd; } else { // 无需调用function2时,根据业务需求调整index自增逻辑,这里默认+1 index += 1; } } } async function2(inlineIndex) { // 创建someArray的逻辑 try { await this.getSomeArray(something); } catch (e) { console.log('Try/Catch Error: ' + e); } // 兜底处理,避免someArray未初始化导致的错误 const x = (this.someArray?.length || 1) - 1; return x; }
关键说明
- 因为
function1是async函数,循环内直接使用await this.function2(index)会阻塞当前迭代,必须等function2执行完成并返回结果后,才会进入下一次循环,完全符合你要求的顺序执行、等待前一次完成的逻辑。 - 修复了
indexAdd的作用域问题,确保外层循环能正确拿到返回值并更新index。 - 给
this.someArray加了可选链?.和兜底值,避免因someArray未初始化导致的读取错误。
内容的提问来源于stack exchange,提问作者user68288
相关产品推荐
相关产品推荐

