[Study] Promise

조혜인·2022년 8월 21일
post-thumbnail

📌 Promise란?

  • Promise는 한국말로 약속이다. 사람과 사람 간의 관계처럼 코드에서도 약속이 이루어진다. Promise로 선언되면 "지금은 없는데 이상없으면 이따가 주고 없으면 알려줄께~" 라는 약속이다.

  • ES6 스펙부터 정식으로 포함되었다.

  • Promise패턴을 잘 사용하면 비동기 작업들을 순차적으로 진행하거나, 병렬로 진행하는 등 이전보다 코드를 제어하기가 쉬워지고 코드의 가독성이 좋아진다.

Promise가 갖는 상태 4가지

  • pending : 아직 약속을 수행 중인 상태이다.
  • fulfilled : 약속이 모두 지켜져 완료된 상태이다.
  • rejected : 약속이 어떠한 사유로 인하여 지켜지지 못한 상태이다.
  • settled : 약속이 지켜졌든 안지켜졌든 일단 결론이 난 상태이다.

Example

아래 코드는 GCP를 사용하여 썸네일을 저장할 때 사용한 코드이다.

const result = new Promise((resolve, reject) => {
  bucket
    .file(event.name)
    .createReadStream()
    .pipe(sharp().resize({ width: el.width }))
    .pipe(
    bucket
    .file(`${prefix}/${el.fname}/${postfix}`)
    .createWriteStream()
  )
    .on("finish", () => resolve("success"))
    .on("error", () => reject("failed"));
});

위에서 약속이 이행되고 난 후 객체를 생성하기 위해 Promise객체를 리턴하도록 함수로 감싸고 있다. Promise함수는 resolve와 reject 매개변수를 가지고 있다. 여기서 resolve는 모든 약속이 이행되었을 때 실행되고 reject는 어떠한 사유로 약속이 이행되지 못할 때 실행된다. resolve나 reject가 호출되기 이전의 순간이 바로 Pending상태이다.

이미지 썸네일을 구현하다보니 입력받은 n개의 이미지를 GCP에 등록하려고 할 경우 Promise를 n번 실행하면 그 만큼의 시간이 배로 들어간다. 이 때 Promise.all을 사용해준다. Promise.all은 여러 개의 비동기 작업들이 존재할 때 이 작업들 모두를 동시에 진행하여 완료하고 싶을 때 사용할 수 있다. Promise.all을 사용하면 n배 들어갈 시간이 훨씬 줄어든다.


📌 참고

profile
코딩은 역시 재밌군

0개의 댓글