Promise
The Promise object represents the eventual completion (or failure) of an asynchronous operation and its resulting value.
Promise가 왜 필요한거지?
프로미스는 주로 서버에서 받아온 데이터를 화면에 표시할 때 사용한다. 일반적으로 웹 애플리케이션을 구현할 때 서버에서 데이터를 요청하고 받아오기 위해 아래와 같은 API를 사용하게 되는데,
$.get('url 주소/products/1', function(response) {
// ...
});
위 API가 실행되면 서버에다가 ‘데이터 하나 보내주세요’ 라는 요청을 보낸다. 그런데 여기서 데이터를 받아오기도 전에 마치 데이터를 다 받아온 것 마냥 화면에 데이터를 표시하려고 하면 오류가 발생하거나 빈 화면이 뜨지않을까? 이와 같은 문제점을 해결하기 위한 방법 중 하나가 프로미스이다.
A Promise is in one of these states:
프로미스를 사용할 때 알아야 하는 가장 기본적인 개념이 바로 프로미스의 상태(states)이다. 여기서 말하는 상태란 프로미스의 처리 과정을 의미하는데, new Promise()로 프로미스를 생성하고 종료될 때까지 3가지 상태를 갖는다.
- Pending(대기) : 비동기 처리 로직이 아직 완료되지 않은 상태
- Fulfilled(이행) : 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태
- Rejected(실패) : 비동기 처리가 실패하거나 오류가 발생한 상태
Pending(대기)
먼저 아래와 같이 new Promise() 메서드를 호출하면 대기(Pending) 상태가 된다.
new Promise();
new Promise() 메서드를 호출할 때 콜백 함수를 선언할 수 있고, 콜백 함수의 인자는 resolve, reject이다.
new Promise(function(resolve, reject) {
// ...
});
Fulfilled(이행)
여기서 콜백 함수의 인자 resolve를 아래와 같이 실행하면 이행(Fulfilled) 상태가 된다.
new Promise(function(resolve, reject) {
resolve();
});
그리고 이행 상태가 되면 아래와 같이 then()을 이용하여 처리 결과 값을 받을 수 있다.
function getData() {
return new Promise(function(resolve, reject) {
var data = 100;
resolve(data);
});
}
// resolve()의 결과 값 data를 resolvedData로 받음
getData()
.then(function(resolvedData) {
console.log(resolvedData); // 100
});
※ 프로미스의 '이행' 상태를 좀 다르게 표현해보면 '완료' 임.
Rejected(실패)
new Promise()로 프로미스 객체를 생성하면 콜백 함수 인자로 resolve와 reject를 사용할 수 있다고 했는데, 여기서 reject를 아래와 같이 호출하면 실패(Rejected) 상태가 된다.
new Promise(function(resolve, reject) {
reject();
});
그리고, 실패 상태가 되면 실패한 이유(실패 처리의 결과 값)를 catch()로 받을 수 있다.
(무조건 성공하는 상태라고 가정한다면, catch와 finally는 생략가능함.)
function getData() {
return new Promise(function(resolve, reject) {
reject(new Error("Request is failed"));
});
}
// reject()의 결과 값 Error를 err에 받음
getData()
.then().catch(function(err) {
console.log(err); // Error: Request is failed
});
무겁고 오래걸리는 일을 조금 더 비동기적으로 처리하여 콜백을 깔끔하게 작성할 수 있음
Promise static method
function fetchEgg(chicken) {
return Promise.resolve(`${chicken} => 🥚`);
}
function fryEgg(egg) {
return Promise.resolve(`${egg} => 🍳`);
}
function getChicken() {
return Promise.reject(new Error("치킨을 가지고 올 수 없음!"));
//return Promise.resolve(`🪴 => 🐓`);
}
getChicken()
.catch(() => "🐔")
.then(fetchEgg)
.then(fryEgg)
.then(console.log);
'내일배움캠프[4기_Reac트랙] > TIL' 카테고리의 다른 글
내일배움캠프 React트랙 32일차 회고 (2022.12.14) (0) | 2022.12.14 |
---|---|
내일배움캠프 React트랙 31일차 회고 (2022.12.13) (0) | 2022.12.14 |
내일배움캠프 React트랙 29일차 회고 (2022.12.09) (0) | 2022.12.12 |
내일배움캠프 React트랙 28일차 회고 (2022.12.08) (1) | 2022.12.08 |
내일배움캠프 React트랙 27일차 회고 (2022.12.07) (1) | 2022.12.08 |