그렇게 비동기, Promise, Async await을 정리하고 정리해도, 모르는 부분들이 하나씩 튀어나온다. 당황스럽다... 바로 정리 시작
Promise 에러 처리
비동기 처리 결과에 대한 후속 처리는 Promise 객체가 제공하는 후속 처리 메서드 then, catch, finally를 사용하여 수행한다. 비동기 처리 시에 발생한 에러는 then 메서드의 두 번째 콜백 함수로 처리할 수 있다.
기본적으로 then은 두 개의 콜백 함수를 인수로 전달받는다. 첫 번째는 fulfilled 상태(비동기 처리시 성공한 상태)에서 호출하고, 두 번째는 rejected 상태에서 호출하는 실패 처리 함수다. then 메서드는 언제나 프로미스를 반환한다. 만약 then 메서드의 콜백 함수가 프로미스를 반환하면 그 프로미스를 그대로 반환하고, 프로미스가 아닌 다른 값을 반환하면 그 값을 resolve 또는 reject하여 프로미스를 생성해 반환한다.
fulfilled 상태에서 호출하는 경우
new Promise(resolve => resolve('fulfilled'))
.then(success => console.log(success), err => console.log(err)) // fulfilled
rejected 상태에서 호출하는 경우
new Promise((_, reject) => reject('rejected'))
.then(failed => console.log(failed), err => console.log(err)) // Error: rejected
비동기 처리에서 발생한 에러는 Promise 객체의 후속 처리 메서드 catch를 사용해서 처리할 수도 있다.
new Promise((_, reject) => reject(new Error('rejected')))
.catch(err => console.log(err)) // Error: rejected
catch 메서드를 호출하면 내부적으로 then(undefined, onRejected)을 호출한다. 즉 위 쪽의 catch를 사용해서 처리된 코드는 내부적으로 아래와 같이 처리된다
new Promise((_, reject) => reject(new Error('rejected')))
.then(undefined, err => console.log(err)) // Error: rejected
Promise에서 에러처리를 할 때 보통 catch를 사용하여 처리하는데, 그 이유로
1. then 메서드로 에러처리 하면 에러처리를 하는 두 번째 콜백 함수가 첫 번째 콜백 함수에서 발생한 에러를 캐치하지 못하고 코드가 복잡해져서 가독성이 좋지 않아 지기 때문이다.
2. catch 메서드를 모든 then 메서드를 호출한 이후에 호출하면 비동기 처리에서 발생한 에러(reject 함수가 호출된 상태)뿐만 아니라 then 메서드 내부에서 발생한 에러까지 모두 캐치할 수 있다.
따라서 Promise에서 에러처리를 할 때 catch 메서드를 사용하는 것을 주로 해야겠다.
'개발 R.I.P.' 카테고리의 다른 글
8.02 Dev.Feedback (OSI 7Layers & 1,2Layers) (0) | 2021.08.02 |
---|---|
7.29 Dev.Feedback (자료구조 Graph, Tree, DFS, BFS) (0) | 2021.07.29 |
7.27 Dev.Feedback ( forEach) (0) | 2021.07.27 |
7.26 Dev.Feedback ( 검색 알고리즘 선형검색, 이진검색) (0) | 2021.07.26 |
7.22 Dev.Feedback (객체지향 프로그래밍 #2) (0) | 2021.07.22 |