꾸준히 공부하는 개발자

[JS] map/forEach 내에서의 async/await (Promise.all) 본문

Javascript

[JS] map/forEach 내에서의 async/await (Promise.all)

kauboy 2019. 11. 9. 14:34

 

  얼마전에 겪은 일인데, Firestore의 DB를 불러와 async await 을 forEach에서 사용하려고 작동시켜 보았는데 제대로 작동하지않아 거의 반나절동안 삽질을 한 기억 때문에 까먹지 않으려고 작성을 해보았습니다.

일단 async await 과 forEach, map에 관해 어느정도 알고있다는 전제 하에 글을 쓰겠습니다.
이 코드를 짜는 당일날 console 에 자꾸 [] 와 같은 빈배열이 들어오고 눌러보면 데이터에 값이 들어가는걸로 보아 비동기처리가 잘 되지않아 구글에 검색을해보니 forEach와 map은 async await 이 작동되도록 반복문이 기달려주지 않는다는 것을 알게 되었습니다.

제가 삽질한 코드와 코드의 수정과정을 보여드리겠습니다.

삽질한 코드


const snapshot =  firebase
      .firestore()
       .col('example')

const array

snapshot.forEach( async (value)=>{

const getValue = await value.get()
    array.push(getValue)

})
console.log(snapshot)  // []

기억은 잘 안나지만 대충 이런 느낌이었던 것 같습니다.

비동기처리가 되지않아 나중에 snapshot 배열에 값이 들어왔습니다.

for(... of ...) 방식

이것을 해결하기 위해 쳐보니 일단 for(... of ...) 방식이 쉬워보이길래 해보았습니다.

 for (value of snapshot){
  const getValue = await value.get()
    array.push(getValue)
 }

이 방법으로 해결은 되었지만 직렬로 처리가되어 매우 비효율적으로 성능이 나오지않았습니다.

Promise.all()

이것을 해결하기위해 Promise.all을 사용하게 되었습니다.

await Promise.all(snapshot.forEach( async (value)=>{

const getValue = await value.get()
    array.push(getValue)

}))
console.log(snapshot)  // []

예제가 기억나는대로 써가지고 잘 작동하지않을수도 있습니다. 읽어주셔서 감사합니다.

Comments