18.3. 프로그램언어 자바스크립트(JavaScript)에서의 비동기 프로그래밍과 Promise 객체

프로그램언어 자바스크립트(JavaScript)에서의 콜백 함수와 비동기 제어

콜백 함수와 비동기 제어는 JavaScript 프로그래밍에서 중요한 개념입니다.

콜백 함수는 다른 함수의 인자로 전달되어 나중에 호출되는 함수를 말합니다. 이를 통해 비동기적인 작업을 처리할 수 있습니다. 비동기 제어는 코드의 실행 순서를 제어하여 비동기 작업이 완료될 때까지 기다리거나 다음 작업을 수행할 수 있도록 합니다.

예를 들어, setTimeout 함수를 사용하여 비동기적으로 코드를 실행하는 경우 콜백 함수를 활용할 수 있습니다.


// setTimeout 함수를 사용한 비동기 예제
console.log('첫 번째');
setTimeout(function() {
  console.log('두 번째');
}, 2000);
console.log('세 번째');

위 예제에서 ‘첫 번째’와 ‘세 번째’가 먼저 출력되고, 2초 후에 ‘두 번째’가 출력됩니다. 이는 setTimeout 함수의 콜백 함수가 비동기적으로 실행되기 때문입니다.

콜백 함수와 비동기 제어를 잘 활용하면 웹 애플리케이션에서 사용자 경험을 향상시키는데 도움이 됩니다.

프로그램언어 자바스크립트(JavaScript)의 Promise 객체 이해

프로그램언어 자바스크립트의 Promise 객체는 비동기 작업을 보다 효율적으로 다룰 수 있게 해주는 객체입니다. Promise는 비동기 작업이 완료되었을 때 또는 실패했을 때의 결과 값을 나타내는 대표적인 방법 중 하나입니다.

Promise 객체는 세 가지 상태를 가집니다: 대기(pending), 이행(fulfilled), 거부(rejected). 대기 상태에서 시작하여 비동기 작업이 성공하면 이행 상태로, 실패하면 거부 상태로 전환됩니다.

Promise 객체는 주로 비동기 작업을 처리할 때 사용됩니다. 예를 들어, 네트워크 요청을 보내고 응답을 받을 때 Promise를 사용하여 요청이 성공했을 때 데이터를 처리하거나 실패했을 때 에러를 처리할 수 있습니다.


// Promise 예제 코드
const myPromise = new Promise((resolve, reject) => {
  // 비동기 작업 수행
  const success = true;

  if (success) {
    resolve('작업 성공!'); // 작업이 성공했을 때 resolve 호출
  } else {
    reject('작업 실패!'); // 작업이 실패했을 때 reject 호출
  }
});

myPromise.then((result) => {
  console.log(result); // 작업 성공 시 실행
}).catch((error) => {
  console.error(error); // 작업 실패 시 실행
});

프로그램언어 자바스크립트(JavaScript)에서의 Promise 체이닝 방법

자바스크립트에서 Promise 체이닝은 비동기 작업을 연속적으로 처리하고 결과를 다룰 수 있는 방법입니다. Promise 체이닝을 사용하면 여러 비동기 작업을 순차적으로 실행하고 각 작업의 결과를 다음 작업으로 전달할 수 있습니다.

Promise 체이닝은 then() 메서드를 사용하여 구현됩니다. 각 then() 메서드는 새로운 Promise를 반환하며, 이를 통해 다음 작업을 연결할 수 있습니다. 이때, 각 then() 메서드는 이전 작업의 결과 또는 에러를 처리할 수 있습니다.

아래는 Promise 체이닝의 예제 코드입니다.


// 비동기 작업을 수행하는 함수
function asyncTask(value) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (value) {
        resolve(value * 2);
      } else {
        reject('Error: Invalid value');
      }
    }, 1000);
  });
}

// 체이닝된 Promise 작업
asyncTask(3)
  .then(result => {
    console.log('Result:', result); // Result: 6
    return asyncTask(result);
  })
  .then(newResult => {
    console.log('New Result:', newResult); // New Result: 12
  })
  .catch(error => {
    console.error(error);
  });

프로그램언어 자바스크립트(JavaScript)에서의 Async/Await 키워드 활용법

Async/Await 키워드는 JavaScript에서 비동기 작업을 보다 간편하게 다룰 수 있게 해주는 기능입니다. Async 함수는 항상 Promise를 반환하며, Await 키워드는 Promise가 처리될 때까지 함수의 실행을 일시 중지시킵니다.

Async 함수를 선언할 때는 함수 앞에 ‘async’ 키워드를 붙이고, 내부에서 비동기 작업을 수행할 때는 ‘await’ 키워드를 사용합니다. 이를 통해 코드를 순차적으로 작성하면서 비동기 작업의 완료를 기다릴 수 있습니다.

아래는 Async/Await 키워드의 활용 예제 코드입니다.


async function fetchData() {
  try {
    let response = await fetch('https://api.example.com/data');
    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

프로그램언어 자바스크립트(JavaScript)에서의 Promise.all과 Promise.race 활용법

프로그램언어 자바스크립트(JavaScript)에서 Promise.all과 Promise.race은 비동기 작업을 다룰 때 유용한 메서드입니다.

Promise.all은 여러 개의 프로미스(Promise)를 동시에 실행하고, 모든 프로미스가 완료될 때까지 기다린 후에 결과를 반환합니다. 만약 하나의 프로미스라도 거부(reject)되면, Promise.all은 해당 거부된 이유를 반환합니다.


const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 1 is resolved');
  }, 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 2 is resolved');
  }, 2000);
});

Promise.all([promise1, promise2])
  .then((results) => {
    console.log(results);
  })
  .catch((error) => {
    console.error(error);
  });

Promise.race는 여러 개의 프로미스 중 가장 먼저 완료된 프로미스의 결과나 거부 이유를 반환합니다. 다른 프로미스들은 무시됩니다.


const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 1 is resolved');
  }, 1000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 2 is resolved');
  }, 2000);
});

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error);
  });

Leave a Comment