Promise 패턴은 이벤트/콜백 패턴의 골칫거리(콜백헬)를 해소하고 비동기 코드를 마치 동기 코드처럼 표현하는 것을 말한다.
1. Promise 생성자
Promise 생성자는 Promise 인스턴스를 생성한다. 이 때 비동기 작업에 해당하는 실행자 콜백을 넘기는데, 실행자는 귀결(resolve)콜백과, 버림(reject)콜백 두 파라미터를 가진다. 작업이 성공하면 resolve, 실패하면 reject콜백이 실행된다. 아래 예제를 보자.
function httpRequest(url, method) {
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest();
request.open(method, url);
request.addEventListener("load", () => {
if(request.status === 200)
resolve(request.responseText);
else
reject(`Error : ${request.status}`);
}, false);
request.addEventListener("error", () => {
reject("request failed");
}, false);
request.send();
});
}
httpRequest('요청 url', 'GET or POST').then((result) => {
console.log(result);
}).catch((e) => {
console.log(e.message);
});
해당 예제는 httpRequest 호출을 promise 패턴으로 한 것이다. resolve(request.responseText) 콜백이 이루어지면 then((result) 부분으로 진행이 되고 reject() 콜백이 이루어지면 catch()로 가게된다.
Promise는 then()으로 체이닝이 가능하기 때문에 콜백헬에 빠졌던 소스들을 좀 더 보기 쉽게 만들 수 있다. 아래는 단순 예제이다.
httpRequest('요청 url', 'GET or POST').then((value) => {
return value;
})
.then((value)=> httpRequest(`요청 url2?param=${value}`, 'GET'))
.then((result) => {
console.log(result);
})
.catch((e) => {
console.log(e.message);
});
Promise는 네 가지 상태값을 가진다.
- Fulfuilled : resolve 콜백이 Promise 아닌 객체를 인자로, 또는 인자 없이 실행될 때의 상태를 의미한다.
- Rejected : 실행자 스코프에서 예외가 발생하거나 reject 콜백이 실행될 경우 상태이다.
- Pending : resolve/reject 콜백 실행 전 Promise의 상태이다.
- Settled : pending 상태가 아닌, fulfilled/reject 중 한 쪽에 도달한 확정 상태이다.
2. Promise 메소드
A. Promise.resolve(value) 메소드
이 메소드의 기본 기능은 임의의 값을 Promise 객체로 바꾸는 것이다.
let value = Promise.resolve(5);
value.then((val) => {
console.log(val);
});
B. Promise.reject(value) 메소드
Promise 객체로의 변환이 아닌 디버깅 용도로 쓰인다.
C. Promise.all(iterable) 메소드
all은 주어진 iterable 객체의 Promise가 모두 이루어질 때 새 Fulfilled Promise를 반환하는 메소드이다.
** for문으로 promise 요청을 돌리는 분들이 간혹 있는데 all을 쓰면된다.
D. Promise.race(iterable) 메소드
주어진 Iterable 객체의 Promise 중 어느 하나라도 이루어질 때 해당 Fulfilled값을 지닌 새 Fulfilled Promise를 반환하는 메소드이다. 프로미스들끼리 경쟁을 붙여 먼저 완료된 Promise 요청에 대한 결과가 반환된다.
'Javascript > ECMAScript 2015 (ES6)' 카테고리의 다른 글
[ES 6] 모듈이란? (0) | 2017.09.19 |
---|---|
[ES 6] Class 구문과 상속 (0) | 2017.09.19 |
[ES 6] Symbol (0) | 2017.09.11 |
[ES 6] Arrow Function - 화살표 함수 (0) | 2017.09.11 |
[ES 6] 블록 스코프 let과 상수 const (0) | 2017.09.11 |