티스토리 뷰
기존에 비동기를 처리 하려면 콜백 함수를 통해 처리 하였는데 아무래도 비동기 처리이다 보니 가독성 측면과 에러 발생 시 예외 처리를 하기 많이 힘들었다. 아래 예시를 보자.
try 문을 시작하여 setTimeout 메소드를 통해 1초 후 'Error' 라는 문자열을 보낸다. 하지만 catch에서 실제 에러를 catch 못하는 현상이 발생한다. 즉 setTimeout 함수의 콜백 함수 내에서 발생시킨 에러는 catch 블록에서 캐치되지 않고 종료되기 때문에 catch 문에서 에러를 잡을 수가 없다.
그래서 이러한 부분들을 해결하기 위해 ES6에서는 Promise를 도입하여 비동기 처리 시 조금 더 명확한 시점에 어떠한 액션을 취할수 있게 되었다.
그럼 Promise에 대해 알아보자.
Promise란 ?
비동기 연산이 종료된 이후 결과 값이나 에러에 대한 handler 역할을 하며, 비동기 메서드지만 동기 메서드인 것 처럼 값을 반환하고 더 명확한 시점에 동기 메서드처럼 처리를 할 수 있게 해준다.
Promise 구문은 new Promise(excutor) 이며, 매개 변수로는 resolve와 reject를 가진다. Promise 생성 시 resolve와 reject 함수를 받아 즉시 실행되며, 비동기 작업 성공 시 resolve를 호출, 실패 시 reject를 호출해 다음 작업을 수행한다.
Promise는 실행한 비동기 연산이 성공하였는지 실패하였는지에 대한 상태 정보를 가지고 있다. 상태 정보에 대해 알아보자.
상태 |
의미 |
언제 |
pending |
이행되거나 거부되지 않은 초기 상태 |
fulfilled 또는 rejected가 호출이 안된 상태 |
fulfilled |
연산 성공 상태 |
fulfilled가 호출된 상태 |
rejected |
연산 실패 상태 |
rejected가 호출된 상태 |
settled |
연산 성공 또는 실패 된 상태 |
fulfilled 또는 rejected가 호출된 상태 |
Promise는 후속 처리 메소드 then, catch 두 가지를 가지고 있다.
then은 두 개의 콜백 함수(onFulfilled, onRejected)를 인자로 전달 받는다. Promise에 이행 또는 거부 처리기를 추가하고 호출된 처리값 반환 또는 처리가 되지 않았을 시 원래 처리된(settled) 값으로 결정하는 새로운 promise를 반환한다.
catch는 하나의 콜백 함수(onRejected)를 인자로 전달 받는다. promise에 거부 처리기를 추가하고 호출된 처리기에 반환값 또는 프로미스가 처리되지 않은 경우 원래 처리된(settled) 값으로 결정하는 새로운 promise를 반환한다.
이 모든 것의 과정을 설명해 보여주는 그림은 아래와 같다.
<첨부: Mozilla Promise 그림 참고>
Promise는 4가지 메소드를 가지고 있다.
1. Promise.all (iterable)
위의 예시는 총 3초 후 모든 값을 반환한다. 이 말은 즉 3개의 setTimeout 메서드가 실행되고 모두 이행 완료 하였을 때 값을 하나의 배열에 모아 return 한다.
2. Promise.race (iterable)
iterable 내의 어떤 Promise가 이행하거나 거부하는 즉시 스스로 이행하거나 거부하는 Promise를 반환한다. 가장 먼저 처리된 Promise가 resolve한 결과를 새로운 Promise를 반환한다.
3. Promise.reject(reason)
4. Promise.resolve(value)
주어진 값으로 다음을 진행하는 Promise 객체를 반환한다. 값이 then 가능한 경우, 반환된 Promise는 then을 따라 마지막까지 상태를 취하며, 아닌 경우 반환된 Promise는 주어진 값으로 이행한다.
감사합니다.
오늘도 해피 코딩하세요 !
'넌 누구야 JavaScript 공부 > JavaScript' 카테고리의 다른 글
JavaScript 새로운 타입 Symbol (ES6) (0) | 2019.03.05 |
---|---|
JavaScript 재사용성을 고려한 Module 그리고 import, export (ES6) (0) | 2019.03.03 |
구글에서 말하는 JavaScript Style Guide (0) | 2019.02.26 |
JavaScript Rest parametor, Spread (ES6) (0) | 2019.02.25 |
JavaScript 프로토타입 기반의 함수 Class (ES6) (0) | 2019.02.22 |
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Let
- JavaScript
- array
- react
- Es5
- TypeScript
- useState
- github
- Function Component
- 깃헙
- virtual dom
- 가상돔
- NestJS
- string
- useEffect
- window
- HTML
- Prototype
- this
- 리엑트
- scope
- 함수 컴포넌트
- ES6
- website
- Angular
- const
- 웹사이트
- 클래스형 컴포넌트
- 클래스 컴포넌트
- class component
- Total
- Today
- Yesterday