Node.js / Promise

박재형·2020년 9월 28일

nodejs

목록 보기
5/6
post-thumbnail

💡 Promise ?

Promise 란, 자바스크립트에서의 비동기 처리를 위해 만들어진 객체이다. 노드는 비동기와 이벤트 기반으로 돌아가기 때문에 콜백함수를 자주 쓰게된다. 하지만 ES6 (ES2015) 부터는 콜백함수 대신 Promise 기반으로 재구성되었다. 물론 아직 콜백이 익숙해졌기 때문에 콜백을 쓰는 API가 많지만 노드의 지옥인 콜백 지옥이 있기 때문에 나도 이제부터 프로미스를 중점으로 써보려고 한다.

Promise의 기본으로는 상태가 있다. 일련의 처리 과정이라고 생각하면 된다.

대기(pending): 이행하거나 거부되지 않은 초기 상태.
이행(fulfilled): 연산이 성공적으로 완료됨.
거부(rejected): 연산이 실패함.

MDN을 보면 위 3개의 상태에 대한 그림이 있다. 먼저 Promise가 대기하고 연산이 성공하는 즉, 이행(fulfilled)가 발생하면 then이 실행된다. 하지만 연산이 실패하는 거부(rejected)가 발생하면 catch가 실행된다.

💻 Example

먼저 프로미스(Promise)를 사용하기 위해서는 프로미스 객체를 생성해야 한다.

new Promise();

위 코드를 통해 프로미스를 생성할 수 있다. 그리고 내부에 resolve와 reject를 매개변수로 갖는 콜백 함수를 넣을 수 있다.

const example = true; // example이 만약 true -> resolve, false -> reject

//promise 변수에 할당
const promise = new Promise((resolve, reject) => {

    if (example) {   // example 여부에 따라 resolve나 reject 결정
        resolve('success');  // 성공하면 then에 전송
    } else {
        reject('failure');  // 실패하면 catch에 전송
    }
})



promise  // promise 변수에 then, catch, finally 등 메서드를 붙힐 수 있다.
    .then((message) => {
        console.log(message);
    })
    .catch((error) => {
        console.log(error);
    })
    .finally(() => {   // 무조건 실행
        console.log('always')
    })

    

    // 실행 결과
    // success
    // always

위 코드는 promis를 사용한 간단한 코드 예제이다. 프로미스 객체를 부르면 바로 대기상태로 되고, 나중에 then과 catch 메서드 등으로 결과 값을 받기 때문에 실행은 바로 하지만 결괏값은 나중에 받는 객체라고 할 수 있다. 또한 나중에 promise변수를 통해 실행을 하기 때문에 프로미스 객체와 promise 변수 사이에 코드를 입력할 수 있다.

promise
    .then((firstMessage) => {
        return new Promise((resolve, reject) => {   
            resolve(firstMessage);  // 여기서 resolve한 메세지가 secondMessage로 이동
        })
    })
    .then((secondMessage) => {
        console.log(secondMessage);
        return new Promise((resolve, reject) => {
            resolve(secondMessage);  // 여기서 resolve한 메세지가 thirdMessage로 이동
        })
    })
    .then((thirdMessage) => {
        console.log(thirdMessage);
    })
    .catch((error) => {
        console.log(error);
    })



// success
// success

위와 같이 then이나 catch에서 다시 다른 then이나 catch를 붙일 수도 있으며, 프로미스 객체를 다시 한번 return하여서 연속으로도 사용할 수 있다.

출처

Node.js 교과서

0개의 댓글