Octoping의 블로그

배열의 원소들을 파라미터로 하는 Promise를 체이닝해야 하는 일이 있었다. 물론 asyncawait을 활용하면 간단하게 구현할 수 있겠지만 함수 안에서 await을 사용할 경우 해당 함수가 async가 되어버리고 만다.

레거시 코드를 리팩토링하는 것이었기 때문에 이것이 어떤 영향을 끼칠지 무서워 다음과 같은 방식으로 작업하였다.

function waitAndLog(data) {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log(data);
      resolve();
    }, 2000);
  });
}

const dataArray = ['hello', 'world', 'and', 'javascript'];

function waitAndLogEverything() {
  dataArray
    .map((data) => () => waitAndLog(data))
    .reduce((prev, curr) => prev.then(curr), Promise.resolve())
    .then(() => console.log('Done!'));
}

/*
[Expected Output]
hello
world
and
javascript
Done!
*/
profile

Octoping의 블로그

@Octoping

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!