20210218_JavaScript09 async, await API, 강의완강
JavaScript08
- JavaScript에 대해 공부하기 위해서 유튜브 ‘드림코딩by엘리’ JavaScript 강의를 듣고 글을 쓰고 있다.(강의가 엄청 잘되 있으니 강의를 찾아보자!)
JavaScript async, await API
동기 vs 비동기
-
동기 사용시 백엔드에서 가져올때 시간이 걸리고 기다려야해서 다음 코드를 진행 못해 사용자는 버벅거림(중간 로딩)을 볼 수 밖에 없음
-
비동기를 사용해서 요청만 해놓고 기다리지 않고 다른 코드를 진행시켜 완료후에 요청한 결과를 전달함
// 동기 사용
// raccon 표시까지 10초
function fetchUser() {
// do network request in 10 sec...
return 'raccoon'
}
// 비동기 사용(promise 사용)
// 일단 raccoon이 표시가 됨
function fetchUser() {
return new Promise((resolve, reject) => {
// do network request in 10 secs...
resolve('raccoon');
});
}
// promise사용시 꼭 resolve 나 reject로 마무리를 해줘야함 안그러면 계속 pending이고 result도 없음
const user = fetchUser();
user.then(console.log);
console.log(user);
- promise chaning을 계속하면 난잡해질수 있음
- async 와 await API을 쓰면 동기식 코드 작성 처럼 간편하게 도와줌
- syntactic sugar :기존의 promise위에 간편한 API를 제공하는 async문 처럼 기존 기능에 간편한 API를 제공하는 것 (e.g class)
async API
- clear style of using promise
- promise가 무조건 나쁜건 아니고 상황에 따라 깔끔해 지거나 이해하기 쉬운(가독성 좋은) 코드로 쓰면 됨
-
async
는 기존의 함수 선언에 붙여 사용하는데, 붙이면 그 함수안의 코드들을 promise로 만들어주기 때문에 비동기로 만들어 줌 -
Promise -> async
- 모양만 async고 promise 생성이 생략된것 뿐임
function fetchUser() {
return new Promise((resolve, reject) => {
// do network request in 10 secs...
resolve('raccoon');
});
}
async function fetchUser() {
// do network request in 10 sec...
return 'raccoon';
}
await API
- aysnc API를 통해 사용할때, 기본적으로 모두 promise 안에서 실행 되기 때문에 비동기 형태를 가지는데 부분적으로 동기가 필요한 상황도 있음.
- 위의 이유 때문에 await를 통해 부분적으로 동기로 만들 수 있음.
- await가 있는 코드는 해당 코드를 실행하여 결과가 나올때 까지 기다림
"producer part"
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getApple() {
await delay(2000); // await은 해당 코드가 끝날때 까지 기다려줌 즉, 비동기의 코드를 동기로 해줌
// throw 'error';
return '🍎';
}
"비동기를 동기로 활용할 때의 코드 형태"
function getBanana() {
return delay(3000)
.then(() => '🍌');
}
"VS"
async function getBanana() {
await delay(1000);
return '🍌';
}
// 위의 chaining 보다 아래 async에서 await를 통해 동기로 활용하여 사용하면 더 쉽게 이해 가능
"consumer part"
"비동기를 동기로 활용할 때의 코드 형태"
function pickFruits() {
return getApple().then(apple => {
return getBanana().then(banana => `${apple} + ${banana}`)
});
}
"VS"
async function pickFruits() {
const apple = await getApple();
const banana = await getBanana();
return `${apple} + ${banana}`;
}
// async 안에서의 await 동기 표현이 더 깔끔함
- 에러 처리
try
,catch
async function pickFruits() {
try {
const apple = await getApple();
const banana = await getBanana();
} catch {
return 'error'
}
return `${apple} + ${banana}`;
}
병렬 처리
- 어차피 바나나, 사과 서로 연관이 안되있기 때문에
- 기존 처럼 getApple, getBanana를 동기로 연결하면 시간이 많이 들음
- 데이터 받아오는 것은 비동기를 통해 병렬로 처리하고 할당할때에만 동기로 만들음
- 시간 절약 좋음
async function pickFruits() {
const apple = await getApple();
const banana = await getBanana();
return `${apple} + ${banana}`;
}
async function pickFruits() {
const applePromise = getApple(); // 병렬로 데이터 받고
const bananaPromise = getBanana();
const apple = await applePromise; // 활용할 변수 할당시에는 동기화 시킴
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
pickFruits().then(console.log);
유용한 Promise APIs
Promise.All()
: promise 배열 전달시 모든 promise들이 병렬적으로 다 받을때 까지 모아줌 (return promise 배열 형태)Promise.race()
: promise 배열 전달시 가장 먼저 값을 return 하는 promise만 return
function pickAllFruits() {
return Promise.all([getApple(), getBanana()])
.then(fruits => fruits.join(' + '));
}
pickAllFruits().then(console.log);
function pickOnlyOne() {
return Promise.race([getApple(), getBanana()]);
}
pickOnlyOne().then(console.log)
노마드 코더 : 바닐라 자바스크립트
js
- JS : 웹 페이지 내의 이벤트를 위해서 만들음 -> 점점 발전하면서 할수 있는 것이 많아짐 -> 영향력이 강해짐
- 만들수 있는 것들 : 고퀄- 웹사이트, 웹앱, 모바일 어플리케이션, 비디오 게임, 데스크톱 앱
- vscode도 js로 만들어짐
- 모든 기기에는 브라우저가 존재하기 때문에 결국 js가 모두 깔려있고 활용가능해서 엄청난 영향력이다!
- 리얼타임에도 강함
글을 마치며..
- 일단 알고 있는 부분이 많아서, 문법은 빠르게 들으면서 보고 직접적으로 js를 통해 만드는 것들을 보고자 한다.
- 유튜브 드림코딩의 엘리님 강의는 정말로 좋은 강의 였다~ 공짜인게 신기할정도로 잘 알려주셨다. 그동안 python 언어 django도 공부 했는데 django에서 사용되는 html을 보면서 나중에 페이지 내에서의 동적인 요소를 추가하는 방법을 알아보고자 js를 배우기로 했고 js에 대한 문법도 잘 익힌 것 같다. 하지만 js를 어디에서 어떻게 사용되어지는지 확실하게 감이 안와서 노마드 코더님의 강의를 보고자 했다.
- 노마드 코더님의 강의는 클론 위주라서 프로젝트가 어느정도 들어가 있어서 언어 복습도 할겸 프로젝트에서 어떻게 쓰는지도 볼겸 들어보기로 하였다.
- 배움에는 끝이 없다. 확실히, python도 정말 좋은 언어지만 javascript도 엄청난 언어 임을 다시금 느끼며 웹에 대한 전체적인 구조를 알아보면 좋을 듯 하다. 그리고 이를 통해서 프로젝트를 진행해 볼 예정이다.