자바스크립트 비동기 반복문 처리

자바스크립트는 단일 스레드로 동작하는 비동기 프로그래밍 언어입니다. 이것은 반복문을 사용하여 작업을 반복하는 동안 비동기 작업의 완료를 기다리는 것이 일반적인 상황입니다. 이번 블로그 포스트에서는 자바스크립트에서 비동기 반복문 처리하는 방법에 대해 알아보겠습니다.

1. for문과 setTimeout

가장 기본적인 비동기 반복문 처리 방법은 for문과 setTimeout 함수를 조합해서 사용하는 것입니다. 예를 들어, 배열의 각 항목에 대해 1초마다 어떤 작업을 수행하고 싶다고 가정해봅시다.

const arr = [1, 2, 3, 4, 5];

for (let i = 0; i < arr.length; i++) {
  setTimeout(() => {
    console.log(arr[i]);
  }, 1000 * (i + 1));
}

이 코드는 for문을 통해 배열의 각 항목에 대한 작업을 반복하고, setTimeout 함수를 사용하여 해당 작업을 비동기적으로 처리합니다. setTimeout 함수의 첫 번째 인자로 실행할 함수를 전달하고, 두 번째 인자로 지연 시간을 설정합니다. 이렇게 하면 배열의 각 항목에 대해 1초 간격으로 작업이 실행됩니다.

하지만 이 방법은 콜백 지옥(callback hell)을 초래할 수 있으며, 코드의 가독성을 낮출 수 있습니다. 또한 setTimeout 함수의 실행 시간이 정확하지 않기 때문에 예상한 작업 실행 시간과 다를 수 있습니다.

2. 비동기 반복문 라이브러리

비동기 반복문 처리를 좀 더 효율적으로 다루기 위해 다양한 라이브러리를 사용할 수 있습니다. 이러한 라이브러리는 비동기 코드를 보다 쉽게 작성하고 관리할 수 있는 기능을 제공합니다. 예를 들면 async.each 함수를 제공하는 async 라이브러리나 Promise.all 함수를 사용하는 Bluebird 라이브러리 등이 있습니다.

const async = require('async');

const arr = [1, 2, 3, 4, 5];

async.eachSeries(arr, (item, callback) => {
  setTimeout(() => {
    console.log(item);
    callback();
  }, 1000);
}, (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('All items processed successfully');
  }
});

위의 코드는 async.eachSeries 함수를 사용하여 배열의 각 항목에 대한 작업을 비동기적으로 처리하는 예시입니다. 각 항목에 대해 실행할 작업을 수행하고 완료 후에는 callback 함수를 호출하여 다음 항목으로 넘어갑니다. err는 오류 처리를 위한 콜백 함수로 오류가 없으면 null이 전달됩니다.

3. ES6 async/await

ES2017부터 도입된 async/await 문법을 사용하여 비동기 반복문을 처리하는 것이 가장 권장되는 방법입니다. 이 문법은 자바스크립트의 비동기 코드를 동기 방식으로 작성할 수 있는 기능을 제공합니다.

const arr = [1, 2, 3, 4, 5];

async function processArray() {
  for (const item of arr) {
    await new Promise((resolve) => {
      setTimeout(() => {
        console.log(item);
        resolve();
      }, 1000);
    });
  }
}

processArray().then(() => {
  console.log('All items processed successfully');
}).catch((err) => {
  console.error(err);
});

위의 예제 코드에서는 async 함수 processArray를 정의하고, for...of 문을 사용하여 배열의 각 항목에 대한 작업을 반복합니다. await 키워드를 사용하여 Promise 객체를 대기하며, 작업이 완료될 때까지 다음 반복으로 넘어가지 않습니다.

async/await를 사용하면 코드가 동기적으로 작성되므로 가독성이 향상되고 오류 처리도 간편해집니다. 또한 Promise를 사용하여 비동기 작업을 처리할 수 있으므로 코드의 유지 보수가 용이해집니다.


자바스크립트에서 비동기 반복문 처리는 코드의 효율성과 가독성에 큰 영향을 미칩니다. 이 블로그 포스트에서는 setTimeout 함수와 for문, 비동기 반복문 라이브러리, 그리고 async/await 문법을 사용하여 비동기 반복문을 처리하는 방법을 알아보았습니다. 개발자는 자신의 상황과 요구에 따라 가장 적합한 방법을 선택하여, 효율적이고 가독성 좋은 코드를 작성할 수 있도록 해야합니다.