[JavaScript] then vs Async/Await

2023. 1. 27. 15:12·JavaScript
반응형

자바스크립트로 개발을 하다보면 Promise 함수, 비동기 작업을 해야하는 경우가 많다. 

이때 습관적으로 Async/Await을 많이 사용한다. 

 

하지만 비동기 작업을 하기 위해서는 then이라는 친구도 있고 이 둘의 차이를 머리로는 알고 있지만 

따로 정리해본 적은 없어서 이번에 정리해보려고 한다. 

 

then 

console.log("1");

const promise = new Promise(function (resolve, reject) {
  setTimeout(() => {
    resolve("success");
  }, 1000);
});

console.log("2");

promise.then(function (value) {
  console.log(value);
});

console.log("3");

then을 사용해서 promise를 처리하는 코드를 작성해봤다. 

 

콘솔에서는 어떻게 찍히게 될까? 

1 => 2 => 3 => success 순으로 출력이 된다. 

 

즉, then은 호출되고 호출된 곳에서 작업을 멈추는 것이 아닌 통과하고 작업이 완료되면 콜백 함수가 호출된다. 

 

Async/Await 

async function test() {
  console.log("1");

  const promise = new Promise(function (resolve, reject) {
    setTimeout(() => {
      resolve("success");
    }, 1000);
  });

  console.log("2");

  async function promiseFunction() {
    const result = await promise;
    console.log(result);
  }

  await promiseFunction();

  console.log("3");
}

test();

하지만 Async/Await을 사용하면 1 => 2 => success => 3 순으로 출력이 된다. 

Async/Await은 호출된 곳에서 비동기 작업이 종료될 때까지 기다렸다가 완료되면 다음 작업으로 넘어간다. 

 

지금까지 봤을 때 then과 Async/Await 중 Async/Await이 좀더 깔끔해보인다. 

그렇다면 모든 비동기 작업은 Async / Await을 사용하면 될까? 

 

then을 사용하는 경우 

일반적으로 비동기 작업을 동기처럼 사용하는 경우에는 Async / Await을 사용하면 된다. 

하지만 Promise가 실행되는 시점과 후속 작업을 하는 시점을 달리해야한다면 then을 사용한다. 

 

Promise.all의 경우가 이런 경우이다. 

일반적으로 유저를 조회하고 해당 유저의 ID로 구매 정보를 가지고 온다면 Async / Await이 더 편할 것이다. 

하지만 유저 리스트를 조회하고 상품 리스트를 조회하는 경우에는 어떨까? 

이런 작업 순서와 무관한 비동기 작업을 병렬로 진행하는 상황이 있을 수 있다. 

const promise1 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 1000);
  });

const promise2 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 2000);
  });

const promise3 = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 3000);
  });

다음과 같이 순서와 무관한 비동기 함수가 3개가 있다고 생각하자. 

이것을 Async / Await으로 작업한다면 어떻게 될까? 

async function test() {
  await promise1();
  await promise2();
  await promise3();

  console.log("작업 완료");
}

test();

다음과 같은 방식으로 작성할 것이고 이것의 소요 시간은 얼마나 나올까? 

1초, 2초, 3초가 걸리는 작업을 순서대로 했기 때문에 일반적으로 6초가 나올 것이다. 

 

promise1 = 1초 => promise2 = 2초 => promise3 = 3초 => " 작업 완료 "

 

하지만 Promise.all을 사용한다면? 

async function test() {
  await Promise.all([promise1(), promise2(), promise3()]);

  console.log("작업 완료");
}

test();

다음과 같이 작성할 것이며, 병렬로 작업을 진행되기 때문에 3초만에 모든 작업이 완료될 것이다. 

 

promise1 = 1초 =>

promise2 = 2초 ==>

promise3 = 3초 ===>

" 작업 완료 "

 

Promise.all이 아니더라도 promise를 단독으로 사용하는 경우에도 사용될 수 있다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'JavaScript' 카테고리의 다른 글

[JavaScript] Date 함수 시간을 한국 시간으로 변경  (0) 2023.04.12
[JavaScript] ??와 || 의 차이  (0) 2023.04.09
[JavaScript] every, some  (1) 2023.01.12
[JavaScript] 재귀함수 vs 반복문  (1) 2022.12.29
[JavaScript] 배열에서 연속적인 숫자 뽑아내기  (0) 2022.12.22
'JavaScript' 카테고리의 다른 글
  • [JavaScript] Date 함수 시간을 한국 시간으로 변경
  • [JavaScript] ??와 || 의 차이
  • [JavaScript] every, some
  • [JavaScript] 재귀함수 vs 반복문
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    Docker
    바질 키우기
    CCNA
    리얼학습일기
    타일러영어
    영어독학
    알고리즘
    네트워크
    자바스크립트
    typescript
    타입스크립트
    다이소
    리액트
    영어회화
    덤프
    프로그래머스
    Node.js
    webpack
    Babel
    식물
    react
    ChatGPT
    바질
    ReactNative
    next.js
    리얼클래스
    javascript
    네이버 부스트캠프
    CSS
    redux
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[JavaScript] then vs Async/Await
상단으로

티스토리툴바