프로미스는 자바스크립트에서 비동기 처리를 위한 패턴입니다.
최초 자바스크립트는 비동기 처리를 위해 콜백 패턴을 이용하였습니다.
문제점으로 가독성이 나쁘고, 비동기 처리 중 에러 처리가 어려우며 여러 개의 비동기 처리가 어려웠습니다.
콜백 헬이라는 문제도 발생하였지만, 가장 큰 문제점은 에러 처리의 한계가 있다는 점으로 느껴집니다.
ES6에서 비동기 처리를 위한 프로미스 패턴이 도입되었습니다.
// 프로미스 생성
const promise = new Promise((resolve, reject) => {
// Promise 함수의 콜백 함수 내부에서 비동기 처리를 수행한다.
if (/* 비동기 처리 성공 */) {
resolve('result');
} else { /* 비동기 처리 실패 */
reject('failure reason');
}
});
프로미스는 표준 빌트인 객체이며, promise 생성자 함수는 비동기 처리를 수행할 콜백 함수를 인수로 전달받는데 이 콜백 함수는 resolve와 reject 함수를 인수로 전달받습니다.
또한 프로미스를 통해 구현한 비동기 함수는 프로미스를 반환하며 후속처리 메서드를 통해 에러 처리가 비동기적으로 동작합니다.
new Promise(resolve => resolve('fulfilled'))
.then(v => console.log(v), e => console.error(e)); // fulfilled
// rejected
new Promise((_, reject) => reject(new Error('rejected')))
.then(v => console.log(v), e => console.error(e)); // Error: rejected
// rejected
new Promise((_, reject) => reject(new Error('rejected')))
.catch(e => console.log(e)); // Error: rejected
new Promise(() => {})
.finally(() => console.log('finally')); // finally
프로미스는 5개의 정적 메서드를 제공합니다.
const resolvedPromise = Promise.resolve([1, 2, 3]);
resolvedPromise.then(console.log); // [1, 2, 3]
const rejectedPromise = Promise.reject(new Error('Error!'));
rejectedPromise.catch(console.log); // Error: Error!
//resolve,reject
const requestData1 = () => new Promise(resolve => setTimeout(() => resolve(1), 3000));
const requestData2 = () => new Promise(resolve => setTimeout(() => resolve(2), 2000));
const requestData3 = () => new Promise(resolve => setTimeout(() => resolve(3), 1000));
Promise.all([requestData1(), requestData2(), requestData3()])
.then(console.log) // [ 1, 2, 3 ] ⇒ 약 3초 소요
.catch(console.error);
//promise.all
Promise.race([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
])
.then(console.log) // 3
.catch(console.log);
//promise.race
Promise.allSettled([
new Promise(resolve => setTimeout(() => resolve(1), 2000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error!')), 1000))
]).then(console.log);
//promise.allSettled
마지막으로 프로미스의 후속처리 메서드의 콜백 함수는 마이크로 태스크 큐에 저장됩니다.
setTimeout(() => console.log(1), 0);
Promise.resolve()
.then(() => console.log(2))
.then(() => console.log(3));
1-2-3 순으로 출력될 것 같아 보이지만, 2-3-1로 출력되는데, 일반 비동기 함수의 콜백 함수는 태스크 큐에 저장되는 반면
promise의 후속처리 메서드의 콜백 함수는 마이크로 태스크 큐에 저장되어 일반 태스크 큐보다 우선순위를 높게 배정받기 때문입니다.
반응형
'공부 > TIL-D' 카테고리의 다른 글
프로젝트 경험 (0) | 2020.08.10 |
---|---|
클로저란? (0) | 2019.08.10 |
[JS]프로토타입 (0) | 2019.08.03 |
배열안의 원소의 합을 반복문을 사용하지 않고 구하기 (0) | 2019.07.31 |
Cold observalbe Hot observable (0) | 2019.06.27 |