为了账号安全,请及时绑定邮箱和手机立即绑定

异步问题async-awit

异步问题async-awit

莫回无 2019-03-30 19:18:01
这个问题不好描述,但我尽量这段是我的业务代码,但是其中的业务与本问题无关首先这个项目我用了一个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 //放里面

}

贴的图写到一半就不想回了


查看完整回答
反对 回复 2019-04-01
  • 1 回答
  • 0 关注
  • 520 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信