promise
란, 비동기 처리를 할때 콜백함수 대신 사용되는 객체입니다. promise
생성자 함수를 통해 생성합니다. 주로 서버와 네트워크 통신으로 데이터를 받아올 때 사용하며 콜백함수와 달리 에러처리가 가능합니다.
promise
는 new Promise()
로 생성하고 종료될 때까지 3가지 상태를 갖습니다.
new Promise(function(resolve, reject) {
console.log("Promise");
});
위와 같이 new Promise()
로 promise
객체를 생성하고 호출하면 대기 상태가 됩니다.
콜백 함수를 선언할 수 있고, 콜백 함수의 인자는 resolve
, reject
입니다.
proimse
호출 시 콜백함수가 바로 실행되기 때문에 주의해야 합니다.
new Promise(function(resolve, reject) {
console.log("Promise");
resolve("hi"); // 성공 then의 인자로 전달
});
promise.then(value => {
console.log(value); // hi
});
콜백함수의 인자 resolve
를 위와 같이 실행하면 이행 (fulfilled) 상태가 됩니다.
그리고 이행 상태가 되면 아래와 같이 .then()
을 이용하여 처리 결과 값을 받을 수 있습니다.
※ promise의 '이행' 상태를 좀 다르게 표현해보면 '완료'입니다.
new Promise(function(resolve, reject) {
console.log("Promise");
resolve("hi"); // 성공 then의 매개변수로 전달
reject(new Error("No network")); // 실패 Error object를 전달
});
promise
.then(value => {
console.log(value); // hi
})
.catch(error => {
console.log(error); // No network
})
.finally(() => {
console.log("finally");
});
new Promise()
로 promise
객체를 생성하면 콜백 함수 인자로 resolve
와 reject
를 사용할 수 있다고 했습니다. 여기서 reject
를 위와 같이 호출하면 실패 (Rejected) 상태가 됩니다.
그리고, 실패 상태가 되면 실패 처리의 결과 값을 .catch()
로 받을 수 있습니다.
.finally()
의 경우 성공과 실패와 관계없이 마지막에 실행합니다.
const fetchNumber = new Promise(function(resolve, reject){
setTimeout(() => resolve(1), 2000);
})
fetchNumber
.then((result) => {
console.log(result); // 1
return result + 10;
})
.then((result) => {
console.log(result); // 11
return result + 20;
})
.then((result) => {
console.log(result); // 31
});
위 코드는 promise
객체를 하나 생성하고 setTimeout()
을 이용해 2초 후에 resolve()
를 호출하는 예제입니다.
resolve()
가 호출되면 프로미스가 대기 상태에서 이행 상태로 넘어가기 때문에 첫 번째 .then()
의 로직으로 넘어갑니다..then()
에서는 이행된 결과 값 1을 받아서 10을 더한 후 그다음 .then()
으로 넘겨줍니다..then()
에서도 마찬가지로 바로 이전 프로미스의 결과 값 11을 받아서 20을 더하고 다음 .then()
으로 넘겨줍니다..then()
에서 최종 결과 값 31을 출력합니다.