猿问

异步问题async-awit

这个问题不好描述,但我尽量

这段是我的业务代码,但是其中的业务与本问题无关
首先这个项目我用了一个orm(typeOrm),我现在在创建mock数据
ProjectPanorama是一个中间表(Project与Panorama的中间表)


我先创建了3个Panorama(mockData.defaultPanoramas)

  1. 再循环这3个Panorama来创建3个ProjectPanorama

  2. 最后保存

最终在数据库中看到的是

ProjectPanorama

projectIdpanoramaId
13
13
13

我上面创建了3个panorama,但似乎只有最后一个被用了

后面我改成这样,不再使用let proj_pano,而是每个循环时const一个
https://img3.mukewang.com/5ca1d2280001538004080585.jpg

结果变正常了

projectIdpanoramaId
11
12
13

正因为这个现象,我才怀疑是异步那出问题,而不是这个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 = project

proj_pano.panorama = p

const markerToPP = []

// 遇到await,跳到forEach的下一个循环

// .....

proj_pano = new ProjectPanorama() // 第三个proj_pano

proj_pano.project = project

proj_pano.panorama = p

const markerToPP = []

// ....

// 当上面的await执行完

// 此时proj_pano,其实是第三个proj_pano

proj_pano.markers = markerToPP // markerToPP时在当前作用域定义的,所以是第一个

await proj_pano.save() //虽然这个orm框架多次调用save是不会保存的,但是每次save前markers是不一样的,框架会允许它保存数据

//还是三个proj_pano

proj_pano.markers = markerToPP // 第二个

await proj_pano.save()

//还是三个proj_pano

proj_pano.markers = markerToPP // 第三个

await proj_pano.save()

另外不要在forEach中使用await 

https://stackoverflow.com/que...



莫回无
浏览 521回答 1
1回答

慕姐4208626

并不是异步问题,也不是const解决的,只是const之后无法再赋值。是作用域问题(闭包),把几个let放循环for和foreach里面。for(...){&nbsp; &nbsp; let xx //放里面}贴的图写到一半就不想回了
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答