Promise.withResolvers 무엇을 위해 나온걸까요?

Promise.withResolvers 라는 새로운 API가 ECMAScript 2024에 추가가 되었습니다. 해당 API는 new Promise() 를 통하지 않고도 Promise를 생성 할 수 있도록 해줍니다.

new Promise(…) - the revealing constructor pattern

보통 저희는 아래와 같은 패턴으로 Promise를 생성하게 됩니다.
기본적으로 Promise는 공개 생성자 패턴을 사용하고 있어 callback 함수내에서만 resolve, reject 함수에 접근할 수 있다는 특징을 가지고 있습니다.
이는 resolvereject 함수를 외부에서 접근하여 상태를 변경 할 수 없어, promise 상태를 안전하게 보호 할 수 있도록 해줍니다.
한 가지 예로 callback 함수 기반으로 되어 있는 파일을 읽는 기능을 수행하는 코드를 promise로 변경한다면 다음과 같습니다.

Promise.withResolvers()

공개생성자 패턴을 사용하고 있는 new Promiseresolve, reject를 callback 함수 외부에는 노출시키지 않는다는 측면에서 안전하다는 장점이 있습니다. 하지만 resolvereject를 외부에서 사용하고 관리하고자 한다면 적절한 방법은 아닙니다.
Promise.withResolversfactory pattern을 활용하여 이러한 한계점을 해결하였으며 다음과 같은 방식으로 사용할 수 있습니다.
  • resolve: Promise 이행 함수
  • reject: Promise 거부 처리 함수
  • promise: Promise 객체
그렇다면 내부 구현은 어떻게 되어 있는걸까요? 사실 매우 간단합니다. 아래 코드 처럼 말이죠.
이 기능이 제안되고 추가된 이유는 무엇일까요? 사실 이유는 간단하게 많은 라이브러리(react, vue, axios, typescript, vite 등)들이 코드내 해당 방법을 활용하고 있기 때문이라고 하며 Promise의 정적 메서드로 추가하여 좀 더 간편하게 사용할 수 있도록 하기 위해서 라고 합니다.
아래는 해당 기능을 활용하고 있는 라이브러리들로 어떤 방식으로 사용이 되고 있는지 한번 확인해보는것도 좋을거 같습니다.
React
Vue
Axios
TypeScript
Vite
Deno stdlib

결론

ECMAScript 2024에 새로 추가된 Promise.withResolvers()는 기존 Promise를 생성하는 방식에 비해 더 유연하고 관리하기 쉬운 방법을 제공합니다. 이 API를 통해 resolvereject를 외부에서 관리할 수 있게 되어, 다양한 상황에서 Promise를 보다 효율적으로 사용할 수 있을거 같습니다.
하지만 아직 개인적으로 어떤 상황에서 resolve와 reject를 외부에서 꺼내서 사용하면 좋을지 잘모르겠습니다. 흠… 관련 코드 좀 더 찾아보고 어떤 유즈케이스가 있는지 알아봐야 될거 같습니다.
 
 

© 2024 dan.dev.log, All right reserved.

Built with NextJS