Loop와 함께 async, await 사용하기

함께 일하는 분이 while 과 함께 async를 사용하면 동작 하지 않는다고 하셔서 확인을 해보았다.

결론은 동작은 잘된다.

다만, array를 이용해서 forEach, map 등을 할경우는 동작 하지 않는다.

그래서 array는 for 문을 이용해서 직렬로 처리 하거나, map으로 모든 오브젝트를 promise로 변환하여 병렬로 처리 하여야 한다.

const sleep = (ms) => {
  return new Promise(resolve => setTimeout(resolve, ms));
}
const wrapSlept = async () => { await sleep(2000) };

function delay(item) { return new Promise(resolve => setTimeout(() => { console.log(item); resolve(); }, 500)); }

const testAwait = async () => {
  //동작
  let i = 0;
  while (i < 5) {
    console.log('i: ', i);
    i++;
    await wrapSlept(3000);
  }
  console.log("Done!");

  //동작
  for (var f = 0; f < 5; f++) {
    console.log('f: ', f);
    await wrapSlept(3000);
  }
  console.log("Done!");

  //동작 안함
  [1, 2, 3].forEach(async (n) => {
    console.log('n: ', n);
    await wrapSlept(3000);
  });
  console.log("Done!");

  //직렬 처리
  for (const item of [1,2,3]) {
    await delay(item);
  }
  console.log("Done!");

  //병렬
  const promises = [1, 2, 3].map(item => delay(item));
  await Promise.all(promises);
  console.log("Done!");

}

testAwait();

기억해두자

참고자료

Posted by lahuman

댓글을 달아 주세요