Elice SW 2/TIL
DAY 18 - TIL
자이구
2022. 4. 29. 21:51
Promise
- promise API는 비동기 API 중 하나
- Task Queue이 아닌 Job Queue microtask Queue를 사용 (잡 큐는 태스크보다 우선순위가 높음)
- 비동기 작업을 표현하는 JS객체
- 비동기 작업의 진행(Pending ), 성공(Fulfilled ), 실패(Rejected) 상태를 표현
- 비동기 처리의 순서를 표현할 수 있음
Pending
우리가 new Promise(callback) 메서드를 호출하면 기본적으로 Pending상태
callback함수는 (resolve,reject) 두 인자를 받음
new Promise((resolve, reject) => {});
Fullfilled위에서 인자로 보내줬던 resolve가 아래와 같이 실행되면 Fullfilled 상태가 된다.
new Promise((resolve, reject) => {
resolve();
})
- Promise.resolve 함수는 성공한 Promise를 바로 반환
- then() 메서드에 성공했을 때 실행할 콜백 함수를 인자로 넘기며 Promise를 반환
- resolve 안에 우리가 return할 값을 넣어주면 나중에 then()을 이용해서 이용해서 값을 다시 받을 수 있음
new Promise((resolve, reject) => {
let data = ["Jaeku", "sunbee", "Lim"];
resolve(data);
}).then(resolvedData => resolvedData.forEach(x => console.log(x)))
Rejected
new Promise()로 만약에 reject를 호출하면 Rejected 상태가 된다. catch()를 이용하면 오류를 출력할 수 있음
new Promise((resolve, reject) => {
reject("Request is failed");
}).then().catch((err) => console.log(err));
- Promise.reject 함수는 실패한 Promise를 바로 반환
- catch()메서드에 실패했을 때 실행할 콜백 함수를 인자로 넘김
Promise 메서드 체인
- 동일한 객체에 메서드를 연결할 수 있는 것을 체이닝
- 함수를 호출한 주체가 함수를 끝낸 뒤 자기 자신을 리턴하도록 하여 구현
- 여러개의 프로미스를 연결해서 씀
new Promise(function(resolve, reject){
setTimeout(function() {
resolve(1);
}, 2000);
})
.then(function(result) {
console.log(result); // 1
return result + 10;
})
.then(function(result) {
console.log(result); // 11
return result + 20;
})
.then(function(result) {
console.log(result); // 31
});
Promise.all
- Promise의 배열을 받아 모두 성공 시 각 Promise의 resolved 값을 배열로 반환
- 하나의 Promise라도 실패할 시, 가장 먼저 실패한 Promise의 실패 이유를 반환
Promise.all([
promise1,
promise2,
promise3
])
.then(values => {
console.log("모두 성공 : ", values)
})
.catch(e => {
console.log("하나라도 실패 : ", e)
})