3.4 프로미스와 async/await

숑이·2024년 3월 12일
0

3.4.1 프로미스

Promise라는 클래스를 사용하는 문법, new는 붙여 Promise 클래스를 호출하면 프로미스 객체를 생성하는데, 이때 인수로 콜백 함수를 넣는다. 콜백 함수이 매개변수로 resolve()와 reject()함수가 있다. 콜백 함수 내부에서는 resolve()나 reject() 함수 둥 중에 하나는 호출해야 한다. resolve() 함수를 호출하면 프로미스가 성공한 것이고, reject()를 호출하면 프로미스가 실패한 것, 둘 다 호출하면 먼저 호출한 함수만 유효하다.

const <프로미스 객체> = new Promise ((resolve, reject) => {
resolve(); //프로미스 성공
//또는
reject(); //프로미스 실패
}

프로미스 객체에는 then() 메서드나 catch() 메서드를 붙일 수 있다.

<프로미스 객체>.then(<콜백 함수>);
//또는
<프로미스 객체>.catch(<콜백 함수>);

두 메서드도 인수로 콜백 함수를 넣는다. then()의 콜백 함수는 resolve() 함수를 호출할때 실행되고, catch()의 콜백 함수는 reject() 함수를 호출할 때 실행된다.
resolve()의 인수로 전달한 값은 then() 콜백 함수의 매개변수로 전달되고, reject()의 인수로 전달한 값은 catch() 콜백 함수의 매개변수로 전달된다.

const p1 = new Promise((resolve, reject) => {
	resolve('success');
});
p1.then((data) => console.log(data)); //success
const p2 = new Promise((resolve, reject) => {
  reject('error');
});
p2.catch((error) => console.log(error)); //error

reject()를 호출했는데 catch() 메서드를 붙이지 않으면 에러가 발생한다.

const setTimeoutPromise = (ms) => new Promise((resolve, reject) => {
    setTimeout(resolve, ms);
});
setTimeoutPromise(3000).then(() => {
    console.log('3초 뒤에 실행');
});

setTimeoutPromise()는 setTimeout() 함수에 필요한 ms를 인수로 받는 고차 함수

프로미스 : 실행된 결과 값을 저장하고 있으며 언제든지 필요할 때 그 값을 꺼낼수 있는 객체

setTimeout()과 같은 비동기 코드는 콜백 함수가 setTimeout()과 딱 불어 있어서 콜백 함수의 위치를 변경할 수가 없었다. 하지만 프로미스로 만들면 필요할 때 then()을 호출할 수 있어서 편리하다.

const promise = setTimeoutPromise(0);
promise
    .then(() => {
        return 'a';
    })
.then((data) => {
    console.log(data);
    return 'b';
})
.then((data) => {
    console.log(data);
});

<a
<b

앞선 then() 콜백 함수의 반환한 값이 다음 then() 콜백 함수의 매개 변수로 전달된다.
만약 반환 값이 프로미스라면 resolve() 한 값이 다음 then() 콜백 함수의 매개변수로 전달된다.

프로미스에는 finally() 메서드도 있다. then()과 catch()의 실행이 끝난 후에 finally()가 있으면 무조건 실행된다.

const promise = setTimeoutPromise(0);
promise
    .then(() => {
        console.log('0초 뒤에 실행');
    })
.catch((err) => {
    console.log('에러 발생 시 실행');
})
.finally((err) => {
    console.log('성공이든 실패든 무조건 실행');
});

< 0초 뒤에 실행
< 성공이든 실패든 무조건 실행

3.4.2 async/await

await는 프로미스가 resolve()할 때 까지 기다리라는 뜻. await을 사용하면 프로미스인 비동기 코드를 순서대로 실핼하게 만들 수 있습니다.

  • 함수 내부에서 await을 사용하려고 하면 에러가 발생한다.
  • await는 async 함수에서 사용할 수 있다.
  • function 예약어 앞에 async를 붙이면 전환된다.
  • 화살표 함수도 앞에 async를 붙여 async 함수로 만들수 있다.

3.4.3 try-catch 문으로 에러 처리하기

await 에러 처리는 try-catch문으로 감싸 줘야 한다. 그러면 reject()의 인수로 넣었던 값이 catch 문의 error로 전달된다.

const p1 = new Promise((resolve, reject) => {
    reject('에러');
});
try{
    await p1;
}catch (error){
    console.log(error);
}

< 에러

0개의 댓글