본문 바로가기

Programming/Node.js

2. Javascript ES2015 (6) - 프로미스 [4/5]

node js logo image

 

 

 

 

 

 

앞선 아티클에서 우리는 3개의 뎁스를 가진 콜백 함수 예제를 살펴보았습니다. 

 

function findAndSaveUser(Users){
    Users.findOne( {}, (err, user) => { // 첫 번째 콜백
        if(err){
            return console.error(err);
        }
        user.name = 'zero';
        user.save( (err) => {    // 두 번째 콜백
            if(err){
                return console.error(err);
            }
            Users.findOne( { gender: 'm' }, (err, user) => {    // 세 번째 콜백
                /* 내용 생략*/
            } );
        } );
    } );
}

 

 

위 예제에 대한 설명이 기억나지 않는다면, 아티클을 다시 복습해 보시기 바랍니다. 

 

 

2. Javascript ES2015 (6) - 프로미스 [3/5]

앞선 아티클에서 프로미스를 사용하는 기본적인 패턴에 대해서 살펴보았습니다. 2. Javascript ES2015 (6) - 프로미스 [2/3] 우리는 앞선 아티클에서, 프로미스를 생성해 then, catch, finally를 출력하는 과

nozeroslope.tistory.com

 

 

이제 본격적으로 위 예제를 프로미스를 활용해서 간결하게 다듬어보도록 하겠습니다. 

 

function findAndSaveUser(Users){
    Users.findOne({})
        .then((user) => {
            user.name = 'zero';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({gender: 'm'});
        })
        .then((user) => {
            // 내용생략
        })
        .catch(err => {
            console.error(err);
        })
}

 

 

위 예제가 살짝 헷갈릴 수 있습니다. 프로미스 초반에 학습했던 내용과 비교하면서 다시 차근차근 살펴보겠습니다. 우선, 프로미스 개념을 처음 설명할 때의 아티클을 되짚어보겠습니다. 

 

 

 

 

2. Javascript ES2015 (6) - 프로미스 [1/5]

당연한 이야기이지만, Javascript와 Node에서는 비동기를 주로 사용하게 되고, 이벤트 리스너에서 콜백 함수에 대한 정의를 자주 쓰게 됩니다. 그러나, 이 콜백 함수들의 사용은 꽤나 코드를 복잡하

nozeroslope.tistory.com

 

 

초반에 아래와 같은 코드가 있습니다. 여기에서 new Promise 객체를 선언하는데, 파라미터에는 resolve와 reject를 파라미터로 받는 함수가 선언되어 있죠. 여기서는 조건 상 true가 전달되므로 then에는 resolve에서 지정해 둔 'SUCCESS parameter'가 파라미터로 전달됩니다. 

 

const condition = true; 
// true면 resolve, false면 reject

const promise = new Promise(
    (resolve, reject) => {
        if(condition){
            resolve('SUCCESS parameter');
        } else {
            reject('FAILED parameter');
        }
    });

    /*
    
    기타 다른 동작들을 선언 가능한 영역

    */

    promise
        .then(
            (message) => {
                // 성공(resolve) 실행
                console.log(message);
        })
        .catch(
            (error) => {
                // 실패(reject) 실행
                console.error(error);
        })
        .finally(
            () => {
                // 무조건 실행
                console.log('UNCONDITIONALLY');
        });


/* 출력
SUCCESS parameter
UNCONDITIONALLY
*/

 

 

위 예제와 비교해 보면, promise라는 변수를 선언하는 과정이 없습니다. 기본형에서는 new Promise 라인에서 condition의 값에 따라 어떤 파라미터 값이 전달될지 선언하는 과정이 있었는데, 여기에는 그 과정이 없습니다. 즉, findOne과 save 메서드는 내부에 프로미스 객체를 갖고 있고 new Promise가 내부에 구현되어 있는 상태입니다. 

 

function findAndSaveUser(Users){
    Users.findOne({})
        .then((user) => {
            user.name = 'zero';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({gender: 'm'});
        })
        .then((user) => {
            // 내용생략
        })
        .catch(err => {
            console.error(err);
        })
}