Promise
Promise: 자바스크립트 비동기 처리에 사용되는 객체
자바스크립트의 비동기 처리를 위해서 크게 3가지가 사용된다.
콜백함수, Promise, async와 await
- 콜백함수로 처리
function getData(callbackFunc) {
$.get('url 주소/products/1', function(response) {
callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
});
}
getData(function(tableData) {
console.log(tableData); // $.get()의 response 값이 tableData에 전달됨
});
- Promise로 처리
function getData(callback) {
// new Promise() 추가
return new Promise(function(resolve, reject) {
$.get('url 주소/products/1', function(response) {
// 데이터를 받으면 resolve() 호출
resolve(response);
});
});
}
// getData()의 실행이 끝나면 호출되는 then()
getData().then(function(tableData) {
// resolve()의 결과 값이 여기로 전달됨
console.log(tableData); // $.get()의 reponse 값이 tableData에 전달됨
});
Promise의 3가지 상태
프로미스의 상태란 프로미스의 처리 과정을 의미한다.new Promise()
로 프로미스를 생성하고 종료될 때까지 프로미스는 3가지 상태를 갖는다.
Pending(대기) : 비동기 처리 로직이 아직 완료되지 않은 상태
Fulfilled(이행) : 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태
Rejected(실패) : 비동기 처리가 실패하거나 오류가 발생한 상태
프로미스 예제
function getData() {
return new Promise(function(resolve, reject) {
$.get('url 주소/products/1', function(response) {
if (response) {
resolve(response);
}
reject(new Error("Request is failed"));
});
});
}
// 위 $.get() 호출 결과에 따라 'response' 또는 'Error' 출력
getData().then(function(data) {
console.log(data); // response 값 출력
}).catch(function(err) {
console.error(err); // Error 출력
});
- Pending (대기)
new Promise()
메서드를 호출하면 대기(Pending)상태가 된다.new Promise()
의 콜백 함수의 인자는 resolve, reject이다.
- Fulfilled (이행)
resolve()
함수가 실행되면 이행(Fulfilled)상태가 된다.
그리고 이행상태가 되면 then()
을 이용하여 처리 결과 값을 받을 수 있다.
- Rejected (실패)
reject()
함수가 실행되면 실패(Rejected)상태가 된다.
그리고 실패상태가 되면 아래와 같이 실패한 이유(실패처리의 결과값)을 catch()
로 받을 수 있다.
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 Chaining)
new Promise(function(resolve, reject){
setTimeout(function() {
resolve(1);
}, 2000);
})
.then(function(result) {
console.log(result); // 1
return result + 10;
})
.then(function(result) {
console.log(result); // 11
return result + 20;
})
.then(function(result) {
console.log(result); // 31
});
위 코드는 프로미스 객체를 하나 생성하고 setTimeout()
을 이용해 2초 후에 resolve()
를 호출하는 예제이다.
resolve()
가 호출되면 프로미스가 대기 상태에서 이행 상태로 넘어가기 때문에
첫 번째 .then()
의 로직으로 넘어간다.
첫 번째 .then()
에서는 이행된 결과 값 1을 받아서 10을 더한 후 그다음 .then()
으로 넘겨준다.
두 번째 .then()
에서도 마찬가지로 바로 이전 프로미스의 결과 값 11을 받아서 20을 더하고 다음 .then()
으로 넘겨준다.
마지막 .then()
에서 최종 결과 값 31을 출력한다.
참고: 캡틴판교
'개인공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL 57일차_Promise.all (0) | 2021.03.16 |
---|---|
TIL 55일차_비동기처리3: async & await (0) | 2021.03.14 |
TIL 53일차_비동기처리1: 콜백함수 (0) | 2021.03.12 |
TIL 52일차_알고리즘: 탐욕알고리즘과 동적계획법 (0) | 2021.03.11 |
TIL 51일차_알고리즘: 유클리드 호제법 (0) | 2021.03.10 |