这个问题不好描述,但我尽量这段是我的业务代码,但是其中的业务与本问题无关首先这个项目我用了一个orm(typeOrm),我现在在创建mock数据ProjectPanorama是一个中间表(Project与Panorama的中间表)我先创建了3个Panorama(mockData.defaultPanoramas)再循环这3个Panorama来创建3个ProjectPanorama最后保存最终在数据库中看到的是ProjectPanoramaprojectIdpanoramaId131313我上面创建了3个panorama,但似乎只有最后一个被用了后面我改成这样,不再使用let proj_pano,而是每个循环时const一个结果变正常了projectIdpanoramaId111213正因为这个现象,我才怀疑是异步那出问题,而不是这个orm库可能的原因由于forEac中第一个await的原因panoramas.forEach(async (p, j) => { proj_pano = new ProjectPanorama() proj_pano.project = project proj_pano.panorama = p // marker const markerToPP = [] for (let k = 1; k <= 3; k += 1) { await marker.save() // 第一个await } proj_pano.markers = markerToPP await proj_pano.save() // project.projectPanoramas.push(proj_pano)})导致程序会这样执行proj_pano = new ProjectPanorama()proj_pano.project = projectproj_pano.panorama = pconst markerToPP = []// 遇到await,跳到forEach的下一个循环// .....proj_pano = new ProjectPanorama() // 第三个proj_panoproj_pano.project = projectproj_pano.panorama = pconst markerToPP = []// ....// 当上面的await执行完// 此时proj_pano,其实是第三个proj_panoproj_pano.markers = markerToPP // markerToPP时在当前作用域定义的,所以是第一个await proj_pano.save() //虽然这个orm框架多次调用save是不会保存的,但是每次save前markers是不一样的,框架会允许它保存数据//还是三个proj_panoproj_pano.markers = markerToPP // 第二个await proj_pano.save()//还是三个proj_panoproj_pano.markers = markerToPP // 第三个await proj_pano.save()另外不要在forEach中使用await https://stackoverflow.com/que...
1 回答
慕姐4208626
TA贡献1852条经验 获得超7个赞
并不是异步问题,也不是const解决的,只是const之后无法再赋值。是作用域问题(闭包),把几个let放循环for和foreach里面。
for(...){
let xx //放里面
}
贴的图写到一半就不想回了
添加回答
举报
0/150
提交
取消