vue.js

async, await와 forEach..를 통해 변경한 값이 안바뀌는 오류

고양이오즈 2021. 12. 17. 11:24

forEach를 통해 한 객체의 값을 await 을 통해서 받아온 값으로 변경하고,

변경된 객체를 백엔드로 보내서 db에 삽입하려 했다.

 

이상하게 분명 변경이 된 것 같은데..

콘솔로 출력해보면 변경된 값이 잘 반영되서 뜨는데..

실제로 백엔드에서 받는 값은 변경 전 값인 버그가 생겼다.

 

_.cloneDeep을 사용해서 깊은 복사 후 출력해보니.. 진짜 값이 안바뀌었다...!

 

한 두시간 정도 낭비하고나서야 그 이유를 알았다.

 

바로 자바스크립트의 동기 비동기 때문ㅜ

 

items.forEach( async (e:any)=> {
               let a = await ~~네트워크 통신 코드~~;
	   e.id = a.id;
            }

console.log(items);

await 백엔드에 items보내서 db에 입력하는 코드~~;

이런 식으로 코드를 짰었다.

 

forEach안에 await을 써서 매개변수값을 바꾸려면 매개변수 받아오는 부분 앞에 async가 있어야 한다.

저 async는 forEach에 한해서만 기다려주니까

저 통신을 기다릴 동안 바로 db insert가 실행되어버린 이었다..ㅜ

 

그니까

1. await 통신 시작

2. insert 실행

3. await 통신 완료

4. console 출력

 

이런 순서로 꼬여버리게 된 것....

 

 

그냥 forEach안쓰고 for로 돌리면 아주 간단하게 해결된다.

for에는 async안 붙여도 되니까 메서드 단위로 기다려주기 때문인 것 같다.. 

괜히 forEach써서 하려다가 시간만 날린 버그ㅜㅜ

 

동기 비동기를 더 정확하게 공부해야겠다!