forEach中使用async函数执行push操作报错无法正常工作如何解决
问题原因
你遇到的报错核心是调用push方法的主体this.test是undefined,和你要push的对象无关,这也是为什么你打印要存入的对象是正常的,但执行push操作报错。
导致问题的两个常见原因如下:
- 你只声明了
test的类型为ProtectionAndOperationModes[],但没有初始化赋值为空数组,TypeScript仅做编译时类型校验,运行时未初始化的数组默认值就是undefined - 其次你使用
forEach包裹异步回调的写法存在隐患:forEach不会等待异步回调执行完成,你无法感知所有数据请求何时全部结束,后续如果要立刻访问test数组会出现数据不全的问题,同时异步回调也存在this指向丢失的风险。
解决方案
- 首先初始化
test数组,在你声明类属性的位置直接赋值空数组:
export class 你的类名 { // 声明类型同时初始化空数组 test: ProtectionAndOperationModes[] = []; // 其他属性和方法... }
- 替换
forEach异步遍历的写法,改用Promise.all批量处理异步请求,既可以保证所有请求完成后再操作数组,也能避免this指向问题:
let snapProtections = JSON.parse(snapshot.protection); this.completeMachine.operationModes = snapOperationModes; // 收集所有异步请求Promise const reqList = snapProtections.map(prot => { return this.protectionDataAcessService.getProtectionAndOperationModesByProtectionId(prot.id) }) // 等待所有请求完成,一次性存入数组 this.test.push(...await Promise.all(reqList))
注意:上述使用
await的代码需要放在async修饰的函数内部才能正常运行。
内容的提问来源于stack exchange,提问作者Sini.py
相关产品推荐
相关产品推荐

