eslint를 사용하던중 발견한 이슈입니다. await를 loop안에서 이용하게 되면 async/await의 병렬화 이점을 충분히 활용하지 않는다 라는 이슈입니다.
async function foo(things) {
const results = [];
for (const thing of things) {
results.push(await bar(thing));
}
return baz(results);
}
이렇게 이용을 하면 비동기인 bar 함수에서 promise요청을 마치고 다음 await함수로 들어가기때문에 비효율적입니다.
async function foo(things) {
const results = [];
for (const thing of things) {
results.push(bar(thing));
}
return baz(await Promise.all(results));
}
반복문안에 await를 적지않고 bar 함수를 실행하여 results 배열에 pending된 Promise가 담아줍니다. 그리고 results 배열을 Promise.all 의 인자에 전달해주면 모든 프로미스의 응답이 끝날때까지 대기하다가 마지막 응답이 끝나면 반환 결과가 담긴 배열을 반환합니다. 이렇게 되면 비동기 함수들을 모두 병렬적으로 실행한 상태에서 마지막 응답이 끝날때 결과를 반환하기에 더 효율적인 코드가 됩니다.