JavaScript

JS | async 와 await

2021. 12. 29. 23:13
목차
  1. 1. async
  2. async 사용 전 promise를 사용하기
  3. await을 쓰지 않는다면?

promise들을 여러가지고 chaining을 할 수 있다.
promise.. then.. promise.. then..
async 와 always를 사용하면 동기식으로 코드를 순서대로 작동하는 것처럼 간편하게 작성 할 수 있다. 기존에 존재하는 promise 위에 간편하게 api를 제공한다.

syntatic sugar

기존에 존재하는 거 위에 기존에 존재하는 것을 감싸서 더욱 간편하게 사용할 수 있는 api를 제공하는 것을 syntatic sugar 라고 한다.
class 또한 prototype을 base로 그 위에 살짝 덧붙여진 syntatic sugar이다.

async & await

깔금하게 promise를 사용할 수 있는 방법
무조건 promise를 async와 await으로 대체해서 사용해야하는 것은 아니다.

1. async

function fetchUser() {            //사용자의 data를 backend에서 받아오는 함수
// do network request in 10 secs...
 (네트워크 통신을 해서 back-end에서 data를 받아오는데 10초정도 걸리는 코드가 있다고 가정)
    return 'ellie';
}

const user = fetchUser();
console.log(user);

위 코드에서 fetchUser() function 처럼 작동하는데 오래 걸리는 코드를 비동기적으로 처리하지 않으면 JS 엔진은 동기적으로 코드를 수행한다.

async 사용 전 promise를 사용하기

function fetchUser() {
    return new Promise((resolve, reject) => {
        //do network request in 10 secs..
        resolve('ellie');
    });
}
// 이렇게 작성하면 fetchUser function은 promise를 return 한다.
// 따라서 user 변수에 then을 사용하여 callback 함수를 등록할 수 있다. 

const user = fetchUser();
user.then();

👇

# promise를 사용하지 않고 간편하게 비동기를 작성할 수 있는 방법
async function fetchUser() {
       retrun 'ellie';
}

const user = fetchUser();
user.then(console.log);

함수 앞에 async keyword를 붙이면 promise를 쓰지 않아도 자동적으로 함수 내부의 블럭들이 promise로 변환되어 진다.

2. await

function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple() {
    await delay(3000);
    return '🍎';
}

async function getBanana() {
    await delay(3000);
    return '🍌';
}

await keyword는 async가 붙은 함수 안에서만 쓸 수 있다.
await keyword는 뒤에 붙은 함수가 끝날때까지 해당 함수의 실행을 기다려준다.

await을 쓰지 않는다면?

아래 코드처럼 chaining이 필요하다.

function getBanana() {
    return delay(3000);
    .then(() => '🍌');
}

Ex) 사과와 바나나를 한번에 따오는 함수를 생성

1. promise chaining
function pickFruits() {
    return getApple()
    .then(apple => {
        getBanana()
        .then(banana => `${apple} + ${banana}`);
    });
}
pickFruits().then(console.log);

👇

2. async 
async function pickFruits() {
    const apple = await getApple();
    const banana = await getBanana();
    return `${apple} + ${banana}`;
}

pickFuirts().then(console.log);

3. await 병렬처리

async function pickFruits() {
    const applePromise = getApple();    //promise를 만드는 순간 바로 실행된다. 
        const bananaPromise = getBanana();

    const apple = await applePromise;
        const banana = await bananaPromise;
        return `${apple} + ${banana}`;
}

2가지 promise가 서로 영향을 주지 않아 병렬적으로 실행할 수 있는 경우에는 위와 같이 쓸 수 있는데 promise에서 제공하는 api를 사용하면 더 간단하게 할 수 있다.

3. useful Promise APIs => Promise의 all API
function pickAllFruits() {
    return Promise.all([getApple(), getBanana()] );
        //promise 배열을 전달하면 모든 promise들이 병렬적으로 다 받을 때까지 모아주는 것.
        then(fruits => fruits.join(' + ');
}
pickAllFruits().then(console.log);

추가적으로 race api는 2가지 promise 중에 먼저 실행되는 promise만 실행시킨다.

'JavaScript' 카테고리의 다른 글

JS | 로그인 활성화 기능 구현 (+ 유효성 로직 추가)  (0) 2022.01.07
JS | 예약어(keyword)와 식별자(Identifiers)  (0) 2022.01.07
JS | Promise ( Producer, Consumer)  (0) 2021.12.28
JS | 비동기 처리의 시작 콜백  (0) 2021.12.27
JS | Array  (0) 2021.12.22
  1. 1. async
  2. async 사용 전 promise를 사용하기
  3. await을 쓰지 않는다면?
'JavaScript' 카테고리의 다른 글
  • JS | 로그인 활성화 기능 구현 (+ 유효성 로직 추가)
  • JS | 예약어(keyword)와 식별자(Identifiers)
  • JS | Promise ( Producer, Consumer)
  • JS | 비동기 처리의 시작 콜백
3jun
3jun
3jun
3jun
3jun
전체
오늘
어제
  • 분류 전체보기 (94)
    • 프로젝트 (5)
    • Web (9)
    • JavaScript (19)
    • React (12)
    • 알고리즘 (31)
    • Git (3)
    • AWS (3)
    • TypeScript (3)
    • CS (2)
    • Error (6)
    • 회고 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • this.props.history.push
  • 프로그래머스 코테
  • 백준 알고리즘
  • Promise
  • 백준 코테
  • 유효성 로직
  • state
  • 백준 js
  • 백준 온라인저지
  • 프로그래머스 코딩테스트
  • 프로그래머스 js
  • 자바스크립트
  • react
  • JavaScript
  • outer environment
  • 프로그래머스 코딩테스트 js
  • msw 에러
  • airbnb style guide
  • msw
  • 백준js

최근 댓글

최근 글

hELLO · Designed By 정상우.
3jun
JS | async 와 await
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.