async函数中await的正确放置位置及插入后脚本运行报错解决方案
你的代码存在三个核心错误:
await仅能在被async关键字修饰的函数内部使用,你最初在.then()的普通回调中添加await,回调未被标记为async,触发语法错误导致脚本无法运行。- 你调整后的备选代码存在语法逻辑错误:
await后直接传入箭头函数的写法完全不符合规范,你需要await的是异步函数执行后返回的Promise实例,而非函数本身。 - 混用
.then()链式调用与async/await两种异步处理语法,逻辑混乱增加出错概率。
可直接运行的修正代码
你可以直接全量替换为纯async/await写法,无需混用.then():
async function masterDeploy(PrimaryControl){ try { // 2. 从项目中收集学习事件日期 const LearnEvents = await progLearnerEvent(progGuid) console.log(LearnEvents) for (let b = 0; b < LearnEvents.length; b++) { // 此处await会等待当前retLearnEvents执行完成后再进入下一轮循环 await retLearnEvents(LearnEvents[b], progGuid, b) console.log(FlightPlanArray) learnEventsArrComb.push(FlightPlanArray) console.log(learnEventsArrComb) } console.log(learnEventsArrComb) return learnEventsArrComb } catch (error) { DisplayError(error) } }
可选优化方案(并行执行)
如果你的业务场景不要求retLearnEvents按顺序执行,可使用Promise.all实现并行调用,大幅提升运行效率:
async function masterDeploy(PrimaryControl){ try { const LearnEvents = await progLearnerEvent(progGuid) console.log(LearnEvents) // 批量生成所有异步任务 const taskList = LearnEvents.map((event, idx) => retLearnEvents(event, progGuid, idx)) // 等待所有任务全部执行完成 await Promise.all(taskList) /* 若retLearnEvents返回FlightPlanArray,可直接获取所有结果无需依赖全局变量: const allFlightPlans = await Promise.all(taskList) learnEventsArrComb.push(...allFlightPlans) */ console.log(learnEventsArrComb) return learnEventsArrComb } catch (error) { DisplayError(error) } }
额外注意事项
- 所有变量建议添加
let/const声明,避免隐式生成全局变量引发逻辑异常。 - 如果你需要在循环中保持串行执行,不要使用
forEach遍历,普通for循环可正常支持await串行等待。
内容的提问来源于stack exchange,提问作者Martin Hutchins
相关产品推荐
相关产品推荐

