비동기 작업에 대한 완료와 실패의 결과 값을 미리 설정한다.
new 생성자로 promise 객체를 설정 가능하다.
대기를 의미
비동기 로직이 아직 완료되지 않은 상태
new Promise();
다음과 같이 호출하면 Peding 상태가 되고 메서드 호출 시 콜백함수를 선언 할 수 있다.
가지는 인자는 resolve reject를 가질 수 있다.
성공을 의미하며 .then을 사용하여 Promise가 종료 된 뒤 작업을 설정 가능하다.
비동기 로직이 완료되어 프로미스가 결과값을 반환한 상태
new Promise(function(resolve, reject) {
resolve();
});
위와 같이 resolve 실행하면 Fulfilled 상태로 전환되며 .then()을 사용하여 결과 값 return이 가능하다.
실패를 의미하며 .catch를 사용하여 오류를 잡아낼 수 있다.
비동기 처리가 실패하거나 오류가 발생한 상태
new Promise(function(reslove, reject) {
reject();
});
위와 같이 reject 실행하면 Rejected 상태로 전환되며 .then()을 사용하여 결과 값 return이 가능하다.
실무에서는 함수를 시작하자 마자 return을 통해 Promise를 선언하여 peding이 시작하도록 하고 Promise함수가 끝나는 부분에서 .then과 .catch를 선언하여 reslove(fulfill)과 error에 대한 정보를 담아두도록 한다고 한다.
Promise의 가장 큰 단점은 에러를 잡아낼 수 있는 타이밍과 결과에 따른 작업을 잡아내기가 힘들다는 점 이다.
function increaseAndPrint(n) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const value = n + 1;
if (value === 5) {
const error = new Error();
error.name = "ValueisFiveOver";
reject(error);
return;
}
console.log(value);
resolve(value);
}, 1000);
});
}
increaseAndPrint(0)
.then(increaseAndPrint)
.then(increaseAndPrint)
.then(increaseAndPrint)
.then(increaseAndPrint)
.then(increaseAndPrint)
.catch((e) => {
console.log(e);
});
위와 같이 resolove와 reject를 사용하여 5가 되면 error를 표출하는 간단한 함수가 있다.
작성자의 입장에서는 value가 5가 되는 타이밍을 알 수 있긴 하지만 코드가 길어진다면 이를 알기 힘들어지고 어느 시점에서 에러를 잡아야 할지 모르는 상황이 나오게 된다.
이를 해결하기 위해서 async await을 사용하면 된다
{
function myPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Promise 성공');
}, 2998);
setTimeout(() => {
reject(new Error());
}, 2997);
});
}
myPromise()
.then((result) => {
console.log(result);
})
.catch((e) => {
console.log(e);
});
}