Promise 생성자

이한재·2023년 3월 4일
0

이 글을 쓰는 목적은 Promise 는 어떻게 생성하는지 정리하기 위해서 입니다.

Promise 는 new 키워드를 이용하여 생성하면 됩니다 그리고 Promise 의 constructor 는 callback 함수를 매개 변수로 받도록 정의되어 있습니다.

callback 함수는 Promise 가 생성이 되는 시점에 불리는 callback 함수이고
Promise 가 resolve 되는 시점에 callback 함수의 매개변수로 정의된 resolveFunc, rejectFunc 가 불립니다.

Promise 의 callback 함수에서 에러가 반환되는 상황이라면 rejectFunc 함수가 호출될 것이고 에러 없이 성공적으로 함수 호출이 종료된다면 resolveFunc 함수가 호출될 것입니다.

code

function isAdult(age) {
	return new Promise((resolve, reject) => {
    	if (age < 18) reject('it\'s not adult')
      
      	resolve('it\'s adult')
    })
}

function isKorean(country) {
	return new Promise ((resolve, reject) => {
    	if (country != 'korea') reject('it\'s not korean')
      
      	resolve('it\'s korean')
    })
}

위 처럼 Promise 객체를 리턴하는 두개의 함수가 정의되어 있는 경우에서
반횐된 Promise 를 resolve 하는 과정을 then, catch 메서드를 호출하여 수행 할 수 있다.

그리고 위에서 선언한 두개의 함수를 연달아 호출하여 결과값을 반환 받으려고하는 상황을 가정해보면 아래와 같을 것이다.

isAdult(18)
	.then(data => {
 	 console.log(data)
  		isKorean('korea')
  			.then(data => console.log(data))
	})

// return
// it's adult
// it's korean

위 코드의 문제점은 프라미스 객체를 resolve 하는 then 구문이 연달아 작성되어있는데
이를 nested then 이라고 부른다.
이렇게 되었을때의 문제점은 가독성이 안좋아 진다는 점이고 이를 해결하기 위해서는 다음과 같이 함수 호출을 리턴하여 then chaning 을 수행하는 방법이 있다.

isAdult(18)
	.then(data => {
 	 console.log(data)
  	 return isKorean('koean')  			
	})
	.then(data => console.log(data))

// return
// it's adult
// it's korean

위의 두개의 코드 블락은 완전히 동일한 기능을 수행하는 코드이고
후자가 좀 더 가독성이 좋아 진것을 볼 수 있는데
후자 또한 then chaning 이 연속적으로 일어나면 가독성이 여전히 안 좋아 질 수 있고
코드 또한 길어 질 수 있다는 문제점이 있어서
이를 해결하기 위해서는 async await 구문을 활용하면 될 것 같다.

const isAdultAndKorean = async () => {
  console.log(await isAdult(19))
  console.log(await isKorean('korea'))
}

isAdultAndKorean()

위 코드 처럼 async 키워드를 사용하여 프라미스 객체를 반환하는 함수에 대해서
await 키워드를 사용하면 코드를 거의 절반가량 줄일 수 있게 된다.

profile
이한재입니다

0개의 댓글