일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- signIn
- cognito
- react DOM
- react-admin
- electron
- 프로그래머스
- node
- react-sortable-hoc
- API Gateway
- window.postMessage
- axios
- react-xml-parser
- dynamodb
- domtoimage
- 가상 DOM
- readableStream
- react-hook-form
- zerocho
- xlsx
- gitignore
- timeinput
- react
- Route53
- electron-builder
- AWS
- jimp
- JavaScript
- TypeScript
- yml
- icrawler
Archives
- Today
- Total
꾸준히 공부하는 개발자
[JS] map/forEach 내에서의 async/await (Promise.all) 본문
얼마전에 겪은 일인데, 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) // []
예제가 기억나는대로 써가지고 잘 작동하지않을수도 있습니다. 읽어주셔서 감사합니다.
'Javascript' 카테고리의 다른 글
[JS] 특정 문자열 세기 (match) (0) | 2020.02.27 |
---|---|
[JS] Canvas image edit from s3 (1) | 2020.02.18 |
[JS] window.postMessage (1) | 2020.02.07 |
[Javascript] 동적으로 열과행이 늘어나는 표(table) 만들기 (domtoimage) (0) | 2019.12.31 |
변수 명명 규칙(naming rule) (0) | 2019.11.12 |
Comments