내가 기억하기 위한 promise, async await

2022. 10. 9. 22:15· Javascript/문법
목차
  1. promise를 사용하지 않는다면?
  2. promise를 사용한다면?
  3. async funciton의 도입
  4.  
  5.  
  6. for await of (노드 10 이상)
  7.  
  8.  
  9. 참고

Promise

  • 콜백 헬 이라 불리는 지저분한 JS 코드의 해결책
  • 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체
  • then을 붙이면 결과를 반환함
  • 실행이 완료되지 않았으면 완료된 후에 then 내부 함수가 실행됨
  • Resolve(성공리턴값) => then으로 연결
  • Reject(실패리턴값) => catch로 연결
  • Finally 부분은 무조건 실행
const condition = true; // true면 resolve, false면 reject

const promise = new Promise((resolve, reject) => {
    if (condition) {
        resolve('성공');
    } else {
        reject('실패');
    }
});
// 다른 코드가 들어갈 수 있다.

promise
    .then((msg) => {
    console.log(msg); // 성공(resolve)한 경우 실행
    })
    .catch((err) => {
        console.log(err); //실패(reject)한 경우 실행
    })
  • 프로미스는 코드를 분리할 수 있냐 없냐에 큰 차이가 있다.

 

promise를 사용하지 않는다면?

function callback(){}
setTimeout(callback, 3000); // 이게 최선... 콜백은 무조건 비동기 안에 있어야 함\

promise를 사용한다면?

const promise = setTimeoutPromise(3000);

console.log('딴짓~');
console.log('좀 하다가~');
console.log('내가 프로미스 끝낫으면 할 때~');
console.log('그때 실행시키고싶어~');
console.log('바로 지금 아래에서~');

promise.then(() => {
    console.log("바로 지금~! promise를 실행할래!!!");
});
  • 이렇게 코드 분리가 가능하다!

 

 

const promise1 = Promise.resolve('성공1');
const promise2 = Promise.resolve('성공2');
Promise.all([promise1, promise2])
    .then((result) => {
        console.log(result); // ['성공1', '성공2'];
    })
    .catch((err) => {
        console.error(err);
    });


// Promise.all(배열): 여러 개의 프로미스를 동시에 실행이 가능함
// allSettled로 실패하면 catch로 간다.

 

 

 

async/await

  • 어싱크가 아니고 에이싱크로 발음하래요...
  • 어웨잇은 어웨잇 ㅎ
  • ajax도 아작스가 아니고 에이잭스 하핫

async funciton의 도입

  • 변수 = await 프로미스; 인 경우 프로미스가 resolve된 값이 변수에 저장
  • 변수 await; 인 경우 그 값이 변수에 저장
async function findAndSaveUser(Users) {
    let user = await Users.findOne({}); // 실행 순서가 오른쪽에서 왼쪽
    user.name = 'zero';
    user = await user.save();
    user = await Users.findOne({gender: 'm'});

    // 생략...
}
  • 대신 await을 쓸 때에는 함수 앞에 async가 붙어 있어야 함

 

 

const promise = new Promise(...)
promise.then((result) => ...)
// 옛날은 안됐지만 지금은 된다. 
const result = await promise;


// 왜 옛날에 안됐냐면 await을 쓰려면 async function 안에만 있어야 했기 때문 (밑에처럼)
async function main() {
    const result = await promise;
}
main();
  • 그리고 또 하나..!
async function main() {
    const result = await promise;
    return 'zerocho'; // return result를 해도 된다.
}

// 주의!!! async함수에서 return한 값들은 무조건 then으로 받아야 한다!!!! async도 promise임. promise를 간단하게 만든 것일 뿐이기 때문! 
main().then((name) => ...) // name에는 main의 return값이 들어감
  • 대신 promise는 resolve를 처리할 순 있으나 reject를 처리할 수 없으니 안에서 따로 다음과 같이 try-catch를 사용한다.
async function main() {
    try{
        const result = await promise;
        return 'zerocho'; // return result를 해도 된다.
    } catch(err) {
        console.log(err);
    }
}

main().then((name) => ...) 

 

 

for await of (노드 10 이상)

  • for await (변수 of 프로미스배열)
  • resolve된 프로미스가 변수에 담겨 나옴
  • await을 사용하기 때문에 async 함수 안에서 해야 함
const promise1 = Promise.resolve('성공1');
const promise2 = Promise.resolve('성공2');
(async () => {
    for await (promise of [promise1, promise2]){
        console.log(promise);
    }
})

 

 

참고

인프런

반응형
저작자표시 (새창열림)

'Javascript > 문법' 카테고리의 다른 글

javascript hoisting  (0) 2022.10.02
javascript reference  (0) 2022.10.02
자바스크립트 신문법 정리(optional chaining, nullish coalescing 연산자)  (0) 2022.06.18
객체 비구조화 할당 (객체 구조 분해)  (0) 2020.10.08
자바스크립트 사용시 주의해야 할 기본적인 문법  (0) 2020.10.08
  1. promise를 사용하지 않는다면?
  2. promise를 사용한다면?
  3. async funciton의 도입
  4.  
  5.  
  6. for await of (노드 10 이상)
  7.  
  8.  
  9. 참고
'Javascript/문법' 카테고리의 다른 글
  • javascript hoisting
  • javascript reference
  • 자바스크립트 신문법 정리(optional chaining, nullish coalescing 연산자)
  • 객체 비구조화 할당 (객체 구조 분해)
sovelop
sovelop
무슨 생각을 해.. 그냥 하는거지
sovelop
so's devlog
sovelop
전체
오늘
어제
  • 분류 전체보기 (141)
    • 🔥TIL (15)
    • 생각 (5)
      • Daily Routine (0)
    • WEB (2)
    • VueJS (1)
    • 파이썬 문법 (17)
      • Django (0)
    • 알고리즘 (23)
      • 백준 알고리즘 (13)
      • 프로그래머스 (0)
      • 기타 사이트 알고리즘 (6)
    • 컴퓨터공학입문 (13)
    • Data_Analysis (9)
    • Javascript (8)
      • 문법 (8)
      • node.js (0)
    • Java (9)
      • 문법 (3)
      • Android Studio (0)
      • Algorithm (2)
    • Server (6)
      • sql (2)
      • linux (2)
    • Back-up (22)
      • Git + Github (5)
      • English (0)
      • etc (17)
    • 테크 관련 세미나 (4)
    • English (0)
    • Error (4)
    • 코테후기 (0)

블로그 메뉴

  • About me

공지사항

인기 글

태그

  • 한빛미디어
  • 혼공자
  • va87m
  • 코알라univ
  • 혼공단
  • 코딩좀알려주라
  • 무접점저소음
  • # 백준 #파이썬 #python

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
sovelop
내가 기억하기 위한 promise, async await
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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