JS Day 12 프로미스
10 Mar 2021 | JavascriptJS Day 12 프로미스
-
Promise
- 비동기 함수에서 콜백 대신 쓰일 수 있다
- Promise 객체를 생성하는 Producer와 그것을 사용하는 Consumer로 나뉜다
// Producer const promise = new Promise((resolve, reject) => { //이 곳에서 네트워크 통신, 파일 로딩 등 비동기 로직을 작성 resolve(value); // 성공하였을 경우 value 전달 reject(error); // 실패하였을 경우 error 전달 })
- new Promise에 전달되는 함수는 executor 실행 함수라고 부른다
- executor는 new Promise가 만들어질 때 자동 실행된다
- executor의 인수 resolve, reject는 자바스크립트가 자체적으로 제공하는 콜백
- promise 객체는 state 변화를 갖는다
- 처음엔 pending(보류) 였다가 resolve가 호출되면 fulfilled, reject가 호출되면 rejected
- Promise 객체를 직접 정의면 생성되는 순간 executor가 실행되므로 이벤트 스케쥴링이 어렵다. 그리고 불필요한 네트워크 통신을 야기할 수 있다
// Consumer promise.then(value => { // promise의 resolve가 전달한 값을 value로 받는다 }) .catch(error => { // 실패하면 reject의 error가 전달된다 }) .finally(() => ); //성공하든 실패하든 수행된다
- finally에는 인수가 없다
-
Promise Chaining
- promise를 연결하여 사용할 수 있다
promise.then(num => num * 2) // .catch(error => ) .then(num => num * 3) // .catch(error => ) .then(num => { return new Promise((resolve, reject) => { // 프로미스 안에서 또 프로미스 호출이 가능하다 }});
- 각각의 then 사이에 catch를 넣어서 예외 처리를 할 수 있다
-
fetch와 promise
- 자바스크립트 내장 모듈인 fetch와 promise는 뗄 수 없는 관계이다
- fetch로 네트워크 요청을 하면 반환 값으로 promise를 받기 때문
fetch(url) .then(response => response.json()) // 받아온 JSON을 파싱한다 .then(value => alert(value.name)) .catch(error => alert(error))