개발 중, forEach로 비동기처리를 하려던 중 실행순서에 오류가 났었다.
순회 메서드인 forEach에 async 키워드를 붙여주면 비동기 처리가 가능할 줄 알았는데 잘 처리가 되지 않았던 것이었다.
https://gusrb3164.github.io/web/2021/02/07/js_foreach
생각보다 원인을 파악하는데 오래걸리지 않았다. 나와 비슷한 상황을 겪은 사람이 한둘이 아니었고, 위의 블로그를 읽고 바로 수정할 수 있었다.
아래 내용과 예제는 여기서 가져온 내용중 비동기 처리에 대한 내용을 가져왔다.
forEach()
는 동기 함수를 기대하며 프로미스를 기다리지 않습니다. 프로미스(또는 비동기 함수)를forEach
콜백으로 사용할 때는 그 의미를 알고 있어야 합니다.
const ratings = [5, 4, 5];
let sum = 0;
const sumFunction = async (a, b) => a + b;
ratings.forEach(async (rating) => {
sum = await sumFunction(sum, rating);
});
console.log(sum);
// 예상 출력: 14
// 실제 출력: 0
단순 누적합을 구하는 예제이지만, forEach의 특성에 따라 예상과는 다르게 실제 출력은 0을 내고 있다.
때문에 비동기 처리를 하고자 하면 forEach말고 다른 방법을 사용하면 된다.