본문 바로가기

카테고리 없음

자바스크립트_Chapter 8. 프로미스(Promise)

앞선 포스팅에서 동기와 비동기에 대한 개념을 정리했고, 자바스크립트는 Non-Blocking Model로 비동기적으로 실행 된다고 했다. 

 

하지만 비동기적인 자바스크립트에서 코드를 동기적으로 처리해야할 때가 있는데 

대표적으로 서버와 통신이 필요할 때인데 필요한 프로미스(Promise) 개념을 정리하도록 하겠다. 

 

#1. 프로미스란? 

자바스크립트에서 비동기 처리를 동기로 처리할 수 있게 돕는 객체 유형이다. 

Why? 
데이터베이스의 데이터를 먼저 가져온 후, 그 데이터를 가공하여 반환하는 함수가 존재한다고 가정하자 !

데이터베이스와의 소통은 I/O이고, Javascript 에서 거의 모든 I/O는 비동기적이므로 아마도 데이터를 가져오기도 전에 데이터 가공 명령이 실행된다면? 에러 발생!

‘언제 진행할지 약속’ ! 언제 진행할지란, 바로 비동기 명령의 실행이 완료된 이후

=> 데이터를 가져온 이후 데이터를 처리하는 명령어들을 Promise 이후에 진행하도록 작성한다면 데이터를 가져오지도 않았는데 처리가 시작되는 오류상황을 회피할 수 있다 !

 

 

프로미스에 대한 간략한 개념은 아래와 같다.

나름 열심히 썼지만.. 어려운 말 투성이인듯..;

 

프로미스의 상태는 3가지로 나뉘어지게 되는데 

  • 대기(Pending): 이행하거나 거부되지 않은 초기 상태.
  • 이행(Fulfilled): 연산이 성공적으로 완료됨.
  • 거부(Rejected): 연산이 실패함.

 

먼저 예제를 한번 보자

# resolve

프로미스를 사용하지 않았다면 비동기적으로 처리되기 때문에 Middle, Last, First 순으로 나올 것으로 예상된다.

 **resolve 괄호안에 데이터를 넣어줄 있다.

resolve 안에 넣어준 데이터가 아래 then의 매개함수로 쓰여져서 마지막 console.log에서는 Resolve! 가 출력되는 모습을 볼 수 있다. 

 

#catch

Promise 안에서 에러가 throw 되거나 reject가 실행되면 catch 메서드에 작성한 함수가 실행된다.

 

#2. 비동기 함수(Async)

비동기 함수는 화살표 함수와 아주 비슷하나 두가지 차이점이 있다. 

1. 비동기 함수의 결과 값은 항상 Promise 객체로 resolve된다.
2. 비동기 함수 안에서만 await 연산자를 사용할 수 있다.

async 함수는 await 연산자를 비동기 함수 안에서만 사용이 가능하며, 이를 이용하면 문법이 훨씬 간결해질 수 있다. 

new Promise(executor) 코드로 Promise 직접 생성하면 executor 바로 실행되는것과 달리, 비동기 함수 함수가 실행되기 전까지 Promise 생성하지 않음

 

#3. await 연산자

await 연산자를 사용하면 Promisefulfill 상태가 되거나 rejected 될 때 까지 함수의 실행을 중단하고 기다릴 수 있다. 

위에서 이야기한 바와 같이 await 연산자는 async 함수 안에서만 사용할 있다.

 

# await 적용하지 않았을 경우

await 적용하지 않은 경우

13~15줄의 실행 부분의 순서가 1) 시작되었습니다. 2) 종료되었습니다. 3) setTimeoutFunc 가 실행된다.

(앞선 포스팅에서 setTimeout 함수의 경우 비동기 함수로 콜 스택이 비었을 때 실행되는 함수이기 때문이다.) 

 

await을 적용한 경우

앞선 게시글에서 실제 사용한 사례를 다시 한번 소개하겠다. 

fetchMovieData라는 함수는 다른 사이트에서 영화 데이터를 가져오는 함수인데, 

await 함수를 통해 데이터가 다 받아질 때까지 기다리는고자 async / await를 사용했다. 

 

앞으로 Node.js 를 배울 때 많이 사용하게 되는 것 같은데 

조금 더 공부를 해보도록 하겠다.