ts-for-jsdev
  • 자바스크립트 개발자를 위한 타입스크립트
  • 들어가며
  • 01 타입스크립트 소개
    • 1.0 들어가며
    • 1.1 정적 타입 분석
    • 1.2 왜 타입스크립트인가
    • 1.3 타입스크립트의 구성요소
    • 1.4 타입스크립트의 역사
  • 02 ECMAScript
    • 2.0 ECMAScript
    • 2.1 블록 수준 스코프
      • 2.1.1 let을 이용한 선언
      • 2.2.2 const를 이용한 선언
      • 2.2.3 스코프 베스트 프랙티스
    • 2.2 객체와 배열
      • 2.2.1 비구조화 할당
      • 2.2.2 나머지 연산자와 전개 연산자
      • 2.2.3 객체 리터럴 변경사항
    • 2.3 함수
      • 2.3.1 기본 매개변수
      • 2.3.2 화살표 함수
    • 2.4 템플릿 리터럴
      • 2.4.1 멀티라인 문자열
      • 2.4.2 문자열 치환
    • 2.5 원소 순회
      • 2.5.1 forEach 메소드
      • 2.5.2 for-of 문법
      • 2.5.3 이터레이터 프로토콜
      • 2.5.4 이터러블 프로토콜
    • 2.6 비동기 처리
      • 2.6.1 프로미스
      • 2.6.2 Async / Await
    • 2.7 맺으며
  • 03 타입스크립트 기초 문법
    • 3.0 타입스크립트 기초 문법
    • 3.1 기본 타입
    • 3.2 배열과 튜플
    • 3.3 객체
    • 3.4 타입 별칭
    • 3.5 함수
    • 3.6 제너릭
    • 3.7 유니온 타입
    • 3.8 인터섹션 타입
    • 3.9 열거형
  • 04 인터페이스와 클래스
    • 4.0 들어가며
    • 4.1 인터페이스 기초
    • 4.2 색인 가능 타입
    • 4.3 인터페이스 확장
    • 4.4 클래스
    • 4.5 클래스 확장
    • 4.6 클래스 심화
      • 4.6.1 스태틱 멤버
      • 4.6.2 접근 제어자
      • 4.6.3 접근자
      • 4.6.4 추상 클래스
    • 4.7 인터페이스와 클래스의 관계
    • 4.8 맺으며
  • 05 타입의 호환성
    • 5.0 들어가며
    • 5.1 기본 타입의 호환성
    • 5.2 객체 타입의 호환성
    • 5.3 함수 타입의 호환성
    • 5.4 클래스의 호환성
    • 5.5 제너릭의 호환성
    • 5.6 열거형의 호환성
    • 5.7 맺으며
  • 06 타입 시스템 심화
    • 6.0 들어가며
    • 6.1 타입 좁히기
    • 6.2 타입 추론
    • 6.3 타입 단언
    • 6.4 집합으로서의 타입
    • 6.5 서로소 유니온 타입
    • 6.6 맺으며
  • 07 고급 타입
    • 들어가며 (7월 2일 공개)
  • 08 모듈과 네임스페이스
    • 들어가며 (7월 16일 공개)
  • 09 실제 프로젝트에서 사용하기
    • 들어가며 (7월 30일 공개)
  • 10 유용한 라이브러리 소개
    • 들어가며 (8월 13일 공개)
    • 맺으며
  • 부록 II : 자바스크립트 언어 생태계
    • ECMAScript 언어 표준과 TC39
    • TC39 프로세스
    • 실제 예시 - Array.prototype.includes
    • 타입스크립트와 ECMAScript
Powered by GitBook
On this page
  1. 02 ECMAScript
  2. 2.6 비동기 처리

2.6.2 Async / Await

프로미스는 콜백을 이용한 사용 패턴의 문제 중 상당 부분을 해소했지만, 완벽한 해결책은 아니었다. ECMAScript 2017에 추가된 Async / Await 문법은 비동기 코드를 마치 동기 코드처럼 쓸 수 있게 해준다.

Async / Await 을 지원하는 환경에서는 함수 선언 앞에 async 키워드를 덧붙여 비동기 함수(async function)를 정의할 수 있다. async 함수가 반환하는 값은 암시적으로 프로미스로 감싸진다.

async function returnTheAnswer() {
  return 42;
}
const implicitlyReturnedPromise = returnTheAnswer();
console.log(implicitlyReturnedPromise instanceof Promise); // true
implicitlyReturnedPromise.then(answer => console.log(answer)); // 42

비동기 함수 내에서는 표현식 앞에 await 키워드를 사용할 수 있다. 이때 await 키워드가 붙은 해당 표현식 expr은 다음과 같은 값을 갖는다.

  • 뒤따르는 값이 프로미스가 아닐 시, expr은 그 값을 그대로 갖는다.

  • 뒤따르는 값이 프로미스일 시, 해당 프로미스가 처리될 때까지 실행을 중지한다. 만약 프로미스가 완료될 경우, expr은 resolve()의 인자로 사용된 값을 갖는다. 만약 그 프로미스가 거부 될 시, expr은 오류를 그대로 위로 던진다.

Async / Await을 이용하면 then 또는 catch 호출 없이도, 마치 동기 코드를 작성하듯 프로미스를 처리할 수 있다.

async function asyncExample() {
  const a = await new Promise(resolve => resolve(42));
  const b = await 42;
  let c;
  try {
    c = await new Promise((_, reject) => reject('Error on await'));
  } catch (e) { 
    console.log(e);
  }
  console.log(`a: ${a}, b: ${b}, c: ${c}`);
}
asyncExample(); // Error on await
                // a: 42, b: 42, c: undefined

이때 이 코드는 비동기 루틴을 포함하고 있음에도 불구하고 코드가 작성된 순서대로, 위에서부터 아래로 순차적으로 실행된다. 예를 들어, 첫 번째 프로미스를 3초가 지나서 처리되도록 해보면 어떨까?

async function asyncExample2() {
  const a = await new Promise(resolve => { setTimeout(() => resolve(42), 3000) });
  const b = await 42;
  let c;
  try {
    c = await new Promise((_, reject) => reject('Error on await'));
  } catch (e) { 
    console.log(e);
  }
  console.log(`a: ${a}, b: ${b}, c: ${c}`);
}
asyncExample2(); // Error on await
                 // a: 42, b: 42, c: undefined

3초가 지나야만 성공하는 첫 프로미스가 실행된 후에 코드가 진행되었음을 로그의 a값이 42로 찍힌 것으로부터 확인할 수 있다. 따라서 앞서 언급한 콜백 헬 예제 다음과 같이 작성 할 수 있게 된다.

try {
  const document = await fetchDocument(url);
  const author = await fetchAuthor(document);
  const posts = await fetchPostsFromAuthor(author);
  /* do somethin gwith posts */
} catch (err) {
  console.log(err);
}

핸들러로 한 단계 더 들어가던 코드가 사라지고, 별도의 핸들러 없이 오류 처리도 try-catch 블록으로 처리하여 훨씬 읽기 쉬운 코드가 되었다. 이처럼 Async / Await 문법을 이용해 ‘이 작업을 먼저 진행한 후 그게 끝나면 이 다음 작업을 진행한다’라는 식의 사람의 마음 속 동작 방식을 그대로 코드로 옮길 수 있다.

Previous2.6.1 프로미스Next2.7 맺으며

Last updated 7 years ago