ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js - Promise
    Node.js 2018. 8. 15. 15:56







    - Promise



    "A promise is an object that may produce a single value some time in the future: either a resolved value, or a reason that it’s not resolved"


    Promise는 ES6 에서부터 지원된 문법으로서 JavaScript 비동기 처리에 사용되는 객체이다.

    비동기 처리라는 뜻은 글 목록 처음( Node.js[1] - Single thread,Async,Callback )에도 설명했듯이 '하나의 요청 처리가 끝날때까지 기다리지 않고 다른 요청을 동시에 처리할수 있는 방식' 을 뜻한다.

    이러한 비동기 처리의 단점중 critical 한 단점으로 동기식 처리가 필요한 작업을 해결하기 어렵다는 것이다.

    웹 애플리케이션을 구현할때 서버에서 데이터를 요청하고 응답하는 API를 보통 많이 사용하는데 비동기 처리를 하게되면 요청을 하기도 전에 응답을 하기 때문에 화면에 오류또는 빈화면이 뜨게 되는경우가 발생하게된다.

    이러한 문제점을 해결하기위해 동기식 처리를 위해 비동기 작업들을 순차적으로 진행해야하는 필요성을 충족시켜줄수있는 객체가 Promise 이다.


    그전까지는 callback 함수를 통해 어느정도 처리가 이루어졌지만 계속적인 사용이 코드의 복잡성을 증가시키고 가독성을 떨어뜨리는 문제점이 발생하였다.

    이러한 상황에서 ES6에서 Promise가 대두되기 시작하면서 많은 개발자들의 각광을 받고 있는데 나 또한 이 Promise에 대해 공부해보기로 했다.



    - Promise 의 상태 


    상태란 여기서 Promise의 처리 과정을 의미하며 총 3가지의 상태를 가진다.


    Pending(대기) - 비동기 처리 로직이 아직 완료되지 않은 상태


    Fulfiiled(이행) - 비동기 처리가 완료되어 Promise가 결과 값을 반환해주는 상태


    Rejected(실패) - 비동기 처리가 실패하거나 오류가 발생한 상태



    아래의 예제코드를 통해 3가지 상태에 대해 좀더 알아보도록 하겠다.


    test.js


    var _promise = function(params){
    return new Promise(function (resolve,reject){
    setTimeout(function(){
    if(params){
    resolve('Fulfilled');
    } else {
    reject(Error('Rejected'));
    }
    },3000);
    })

    }


    _promise 라는 함수를 선언하였고 이 함수는 params 라는 파라미터와 Promise 객체를 리턴하는 함수이다.

    두번째 줄에 Promise 객체는 resolve와 reject 라는 파라미터를 가지고 있는 익명함수를 담고 있다,


    Promise 객체가 호출이 되고 그 안에 구현부에서 resolve 와 reject가 호출되기 직전의 상태를 pending 상태라고 한다.


    new Promise(function (resolve,reject){

    구현부........

    })


    구현부 안에서 비동기 작업이 성공적으로 완료된후 결과 값을 반환해주는 상태를 fulfilled 상태라고 하며 resolve()함수를 호출한다.


    resolve('Fulfilled');



    구현부 안에서 비동기 작업이 실패하거나 오류가 발생한 상태를 rejected 상태라고 하며 reject() 함수를 호출하게된다.


    reject(Error('Rejected'));



    다음은 Promise 호출했을때 나타나는 실행부이다.

    Promise 객체가 리턴이 되는데 파라미터로 true가 대입됬기때문에 구현부안에서 resolve가 호출이 되어진다.

    이렇게 정상적으로 비동기작업이 완료되는 상태를 거치게 되면 then API를 통해 그다음 실행 되는 함수가 실행된다.


    -> Fulfilled


    _promise(true).then(function(text){

        console.log(text);
    }).catch(function(error){
    console.log(error)
    })


    그에 반하여 false를 파라미터로 대입시켰을때 else 구문에서 에러를 발생시키는 reject 코드가 호출되어지는데 이럴때 처리할수 있는 catch API 를 통해 에러처리가 가능하다.



    -> Error: Rejected

        at Timeout._onTimeout (C:\workspace\nodejs\PromiseTest\test.js:7:24)

        at ontimeout (timers.js:498:11)

        at tryOnTimeout (timers.js:323:5)

        at Timer.listOnTimeout (timers.js:290:5)




    promise 객체는 앞에 예시와 같이 결과가 성공인지 실패인지에 따라 이를 핸들링하는 로직을 정의해놓는다.

    에러 처리 로직을 catch 구문을 사용하지 않아도 then API 자체적으로 아래와 같은 형식으로 지원한다.


    promise.then( 결과처리함수(결과값) , 에러처리 함수(err))




    promise.then(function(result){

    // 결과 처리 로직

    }, function(err){

    // 에러 처리 로직

    })





    https://joshua1988.github.io/web-development/javascript/promise-for-beginners/


    http://programmingsummaries.tistory.com/325


    'Node.js' 카테고리의 다른 글

    Node.js - async/await  (0) 2018.08.31
    Node.js - Mocha  (0) 2018.08.13
    Node.js - Webpack  (0) 2018.08.09
    Node.js - Babel  (0) 2018.08.07
    Node.js[2] - Event Loop, 주의사항  (0) 2018.04.01
Designed by Tistory.