[모각코 23-1] 7회차- 프로미스 객체
콜백 안에 콜백 안에 콜백 안에 콜백 …. => 콜백 지옥
콜백을 사용했을 때의 복잡함을 피하기 위해, ES6부터 “프로미스(promise)” 등장
처리에 성공했을 때 실행할 함수와 성공하지 못했을 때 실행할 함수를 미리 약속하자는 것이다.
프로미스는 객체를 생성하는 부분과 소비하는 부분으로 나뉜다.
먼저, 프로미스를 사용하려면 Promise 객체를 먼저 만들어야 한다. 생성!
성공했을 때 실행할 함수 resolve()와 실패했을 때 실행할 함수 reject()도 함께 지정해야 한다.
let likePizza = true;
const pizza = new Promise((resolve, reject) => {
if (likePizza)
resolve('피자를 주문합니다.');
else
reject('피자를 주문하지 않습니다.');
});
프로미스 제작 코드에서 ‘성공'과 ‘실패’를 확인한 후 소비 코드로 알려준다.
소비코드는 다음 세 함수를 사용하게 된다.
- then() – 프로미스에서 성공했다는 결과를 보냈을 때 실행할 소스
- catch() – 프로미스에서 실패했다는 결과를 보냈을 때 실행할 소스
- finally() – 프로미스의 성공과 실패에 상관없이 실행할 소스
pizza
.then (
result => console.log(result)
)
.catch (
err => console.log(err)
)
.finally (
() => console.log(“완료”)
);
첫번째 코드블럭의 likePizza 가 true 이면..
피자를 주문합니다.
완료
false 이면..
피자를 주문하지 않습니다.
완료
가 출력된다.
프로미스의 상태
- pedding : 처음 프로미스를 생성하면 이 상태가 된다.
- fulfilled : resolve() 를 수행하면 이 상태가 된다.
- rejected: reject() 를 수행하면 이 상태가 된다.
제작코드에서는 fulfilled 상태인지, reject 상태인지에 따라 ‘피자를 주문합니다.’ 또는 ‘피자를 주문하지 않습니다.’라는 결괏값을 넘겨준다.
소비코드에서는 결괏값을 result나 err 같은 변수 이름으로 받아서 사용한다.
맨 처음에 콜백지옥을 벗어난 프로미스라고 했는데,
어떻게 콜백 지옥을 벗어나냐...
프로미스 체이닝
A.then(B).then(C)
then() 함수는 이전 프로미스의 결괏값을 받아서 다른 함수로 연결한다.
const pizza = () => {
return new Promise((resolve, reject) => {
resolve("피자를 주문합니다.");
});
};
const step1 = (message) => {
console.log(message);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('피자 도우 준비');
}, 3000);
});
};
const step2 = (message) => {
console.log(message);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('토핑 완료');
}, 1000);
});
};
const step3 = (message) => {
console.log(message);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('굽기 완료');
}, 2000);
});
};
피자를 만드는데에 이러한 순서의 코드가 필요하다고 해보자.
대충.. 피자 주문하기 -> 도우 준비(step1) -> 토핑 완료(step2) -> 굽기 완료(step3) 의 순서로 진행되어야 한다.
pizza()
.then((result) => step1(result))
.then((result) => step2(result))
.then((result) => step3(result))
.then((result) => console.log(result))
.then(() => {
console.log('피자가 준비되었습니다.');
});
여기서 더 줄일 수 있다!
pizza()
.then(step1)
.then(step2)
.then(step3)
.then(console.log)
.then(() => {
console.log("피자가 준비되었습니다.");
});