Javascript Promise 객체의 이해
2020, Oct 19
Promise 객체란?
- 비동기 상태를 값으로 다룰 수 있는 객체
- 비동기 프로그래밍을 동기 프로그래밍 방식으로 코드를 작성할 수 있음
- Javascript ES6에서는 프로미스 객체가 포함이 됨
Promise 객체의 3가지 상태
- Pending : 결과 기다림
- fulfilled : 수행 정상 종료 (결과 값 O)
- rejected : 수행이 비정상적으로 종료
Promise 생성 방법
const promise1 = new Promise((resolve, reject)=>{});
const promise2 = Promise.reject('error message')
.then(null, error => console.log(error));
const promise3 = Promise.resolve("1")
.then(data => console.log(data));
Promise 이용 방법
then
: 처리된 상태의 프로미스를 처리할 때 사용하는 메서드- then 메서드를 여러번 사용 가능
onReject
함수에서는 onResolve 함수에서 발생한 예외는 처리되지 않음. 따라서catch
함수를 사용하는 것이 좋음finally
메서드는 가장 마지막에 사용되고 처리된 상태인 프로미스 데이터에 추가작업 할 때 사용
// then 메서드 활용
Promise.resolve(1).then(data => console.log(data)); //1
Promise.reject('err').then(null, err => console.log(err)); //err
// 여러 번 사용
Promise.resolve(1)
.then(data => {
console.log('then1 지나감');
return 1
})
.then(data => {
console.log('then2 지나감');
return 1
})
.then(data => console.log(data)); //1
Promise.reject('err')
.then(()=> console.log('then1 지나감') , ()=> console.log('then2 지나감')) //then2 지나감
.then(()=> console.log('then3 지나감') , ()=> console.log('then4 지나감')) //then3 지나감
//onResolve 함수에서 발생한 예외는 처리되지 않으므로 catch 함수 권장
//catch 이후에도 then 사용 가능
Promise.resolve(1)
.then((data)=>{
console.log(data);
throw new Error ('error 발생');
})
.catch(error => {
console.log(error);
return 'error 로그 전달';
})
.then((log)=>{
console.log(log);
})
.finally(()=>{
console.log('final');
})
Promise.all
- 여러 프로미스 객체를 병렬 처리할 때 사용
- 병렬로 코드를 작성하면 되지만 서로 의존성이 있다면
Promise.all
로 처리하는 것이 좋음
const p1 = Promise.resolve(10);
const p2 = Promise.resolve(20);
// requestData().then(data => console.log(data));
//의존성이 없을 경우
p1.then((returnData) => {
console.log(returnData);
});
p2.then((returnData) => {
console.log(returnData)
});
//의존성이 있을 경우
Promise.all([p1, p2]).then(([returnData1,returnData2]) => {
console.log(returnData1, returnData2);
});
Promise.race
- 가장 빨리 처리된 프로미스를 가져올 때 사용
function p1(){
return fetch('sadf')
.then(()=>{
})
.catch(err=> {return ' 데이터 로딩 성공 '});
}
//1초 안에 데이터 로딩이 성공하면 then ' 데이터 로딩 성공' 출력, 실패하면 err 로그 출력
Promise.race([p1(),
new Promise((_,reject)=>{
setTimeout(reject, 1000);
}),
])
.then(data=>console.log(data))
.catch(err=>console.log(err));