Javascript Promise

2021년 7월 9일 수정

Javascript Promise

Promise는 비동기 처리를 간단하게 하기 위한 문법과 기능을 제공하는 Javascript의 클래스다. 혹은 이 Promise의 인스턴스(오브젝트) 자체를 부르는 이름이기도 하다.

영어 단어 자체의 의미처럼 미래에서 실행을 약속하는 것 같다는 느낌으로 이해하면 될 것 같다.

Promise 사용법 간단 정리

아래 예제는 Promise를 이용한 기본적인 비동기 처리와 에러일 경우 처리 코드다.

function doWhat() {
  return new Promise(function(resolve, reject) {
    someAsyncJob(function(result) {
      if (succeed(result)) {
        resolve(result);
      } else {
        reject(new Error("error!"));
      }
    })
  });
}
  • new Promise() 를 통해 간단히 Promise 객체가 생성된다.
  • Promise의 콜백으로 넘기는 함수에는 두 개의 인자가 있으며 각 성공(resolve) 및 실패(reject) 시 호출해야 할 콜백 인스턴스다.

위의 doWhat() 함수를 호출할 때는 아래처럼 then 을 이용해 비동기 함수의 실행이 끝났을 때의 처리를, catch 를 통해 실패했을 때의 처리를 할 수 있다.

doWhat().then(function(result) {
  console.log("completed with result " + result);
}).catch(function(message) {
  console.log("error: " + message);
});

이렇게 함수를 만들어서 호출하는 것도 좋은 방법이다.

물론 일회성으로 처리하려는 경우에는 굳이 정적 함수를 만들지 않고 바로 Promise 객체에 대고 소리를 지르는(?) 방식도 괜찮을 것 같다.

new Promise(function (resolve, reject) {
  doWhat(function (result) {
    resolve(result);
  });
})
.then(function (result) {
  ...
})
.catch(function (message) {
  ...
});

async 그리고 await

async 는 함수나 익명 함수 선언 앞에 붙여서 해당 함수가 비동기적으로 동작한다고 선언하는 명령이다.

async function f() {
  return "from f";
}

이렇게 하면 이 함수는 Promise 객체를 반환한다. 따라서 위에서 봤던 것과 동일하게 사용할 수 있다.

f().then(function (message) {
  console.log(message);
});

앞서 살펴본 Promise 객체 처리와 비슷하다.

만약 좀 더 코드를 좀 더 단순하게 만들고 싶다면, 혹은 Promise 객체를 비동기가 아닌 동기로 처리하고 싶다면 await 를 사용할 수 있다. await 는 비동기 처리가 완료될 때까지 기다린다는 선언이다.

async function f() {
  return "from f";
}

async function doWhat() {
  let message = await f();
  console.log(message);
}

위 코드에서 doWhat() 을 실행시키면 콘솔에 from f 라는 메시지가 표시된다.

이렇게 await 를 이용하면 기존의 Promise에 비해 상당히 간편하게 비동기 처리를 할 수 있다.

다만 awaitasync 가 선언된 함수 내에서만 사용할 수 있는 제약이 있다. 당연히 비동기 처리를 동기 시키는 행위는 메인 스레드를 멈추게 할 가능성도 있는 만큼 당연히 비동기화 되어야 할 것이다.