Promise
Promise
는 자바스크립트에서 비동기를 간편하게 처리해줄 수는 있는 오브젝트입니다.
(콜백함수 대신에 유용하게 사용할 수 있습니다.)
Promise는 기능이 정상적으로 수행이 된다면 성공의 메시지로 처리된 결과값을 전달해주고,
만약 기능을 수행하다 예상치 못한 문제가 발생한다면 에러를 전달해줍니다.
염두에 둘 것.
- State: pending 상태 -> fulfilled or rejected
- Producer: 데이터를 만들어내는 프로듀서
- Consumer: 데이터를 소비하는 컨슈머
pending: promise가 만들어져서 우리가 지정한 연산이 수행중일 때
fulfilled: 연산 수행이 완전히 끝날 때
rejected: 문제가 발생시
**만약 헤비한 코드를 수행하는데 동기적으로 처리하면 파일을 읽거나 네트워크에서 데이터를 받아오는 동안에 코드가 실행되지 않기 때문에 비효율적입니다.
따라서 promise를 만들어서 비동기적으로 처리합니다.
선언
const promis = new Promise((resolve, reject) => {
// heavy work
console.log('doing something');
});
주의
- 이렇게
new Promise
로 만드는 순간 우리가 전달한executor
콜백함수가 바로 호출이 됩니다. - 따라서 만약 사용자가 요청을 할 때에만 응답을 해주어야 하는데 요청을 하지도 않았는데 응답해주는 난감한 상황이 올 수 있습니다.
Producer
const promis = new Promise((resolve, reject) => {
// heavy work
console.log('doing something');
setTimeout(() => {
resolve('minsu');
//reject(new Error('no network'));
}, 2000);
});
- 2초뒤에 수행이 완전히 끝나면
resolve()
함수 호출 - 이렇게 데이터를 만드는 것 -> Producer
Consumer
promis.then((value) => {
console.log(value);
.then(value => {
console.log(value);
})
.catch(error => {
console.log(error);
})
.finally(() => {
console.log('finally');
});
})
then
: 연산 수행이 정상적으로 끝나면. (그렇다면)- 콜백함수를 호출합니다.
value
의 값은Producer
에서 정상적으로 동작했는데resolve()
에서 전달한 값 'minsu'가 됩니다. Producer
에서reject()
를 전달하면 에러 메시지가 뜹니다.catch()
문을 사용하여 예외처리도 가능합니다.체이닝
:then()
사용하여 promise가 리턴되고 다시 리턴된 프로미스에.(닷)
으로catch()
를 사용하는 것finally()
를 사용하면 성공하든 실패하든 출력하게 됩니다. 즉, 어떤 기능 마지막으로 사용하고 싶은 때 이용하면 좋습니다.
'공부 기록' 카테고리의 다른 글
Eclipse 개발 환경 구축 (톰캣) (0) | 2021.05.20 |
---|---|
async & await (0) | 2020.10.22 |
동기 & 비동기 (0) | 2020.10.22 |
JavaScript에서 Getter와 Setter (0) | 2020.10.21 |
자바스크립트 기본2 (0) | 2020.10.21 |
댓글