45 Promise
비동기 함수는 동기함수가 끝나야 테스크 큐에서 콜스택으로 푸쉬에서 실행되므로, 반환 결과를 외부에서 확인할 수 없고, 상위 스코프 변수에 할당할 수도 없다.
따라서 비동기 함수의 처리결과에 대한 후속처리는 비동기함수 내부에서 수행해야한다.
에러처리의 한계
콜백 패턴으로 비동기 처리를 하면, 에러처리가 곤란하다.
try{
setTimeout(()=>{throw new Error()}, 2000);
}
catch(err){
console.log(err);
}
에러가 잡히지 않는다.
에러는 호출자 방향으로 전파된다. 즉, 콜스택에 위에 있는 함수에서 아래에 있는 함수로 전파된다. 이때 비동기 함수는 콜스택에 없으므로 에러가 전파되지 않는것이다.
프로미스의 생성
const promise=new Promise((resolve, reject)=>{
if(성공){
resolve();
else{
reject();
}
}
프로미스 상태정보
상태정보 | 의미 | 조건 |
---|---|---|
pending | 비동기 수행전 | 생성된 직후 |
fulfilled | 비동기 처리 성공 | resolved 함수 호출 |
rejected | 비동기 처리 실패 | reject 함수 호출 |
후속처리메서드
비동기 처리 상태가 변화하면 후속처리 메서드에 인수로 전달된 콜백함수가 선택적으로 호출됨
Promise.prototype.then
then은 두개의 콜백함수를 인수로 전달받음
첫번째 콜백은 성공인 경우 결과를, 두번째 콜백은 에러를 인수로 받음
new Promise(resolve=>resolve('fullfilled'))
.then(v=>console.log(v), e=>console.log(e));
then 메서드는 언제나 프로미스를 반환함
프로미스가 아닌값을 반환하면, 암묵적으로 resolve, reject하여 프로미스를 생성해 반환함.
Promise.prototype.catch
한개의 콜백함수 즉, 실패했을때의 콜백함수를 인수로 받는다.
에러처리를 돕는다.
Promise.prototype.finally
프로미스의 상태와 관계없이 공통적으로 수행해야할 처리 내용을 처리한다.
프로미스 체이닝
후속처리 메서드는 언제나 프로미스를 반환하므로 계속해서 후속처리 메서드를 사용할 수 있다.
Promise.all
인수로 프로미스 형태의 배열을 받으며, 결과로 프로미스가 실행된 결과의 배열을 반환한다.
Promise.race
마찬가지로 프로미스 형태의 배열을 받으며, 결과로 가장 빨리 fulfilled된 프로미스 결과를 반환한다.
마이크로 태스크큐
마이크로 태스크 큐는 태스크 큐보다 우선순위가 높다.
프로미스는 마이크로 태스크큐에 들어가서, setTimeout보다 빠르게 작동한다.
Fetch와 axios
Fetch는 에러처리시에 404등의 에러를 error로 throw하지 않음
axios는 모든 HTTP에러를 reject하는 프로미스를 반환함