본문 바로가기

IT/Web Programming

[javascript] Promise를 사용해봅시다.


자바스크립트를 이용하여 웹페이지를 만들거나 어플리케이션을 만들다보면 콜백안에 콜백, 또 그안에 또 콜백..

이른바 콜백 지옥에 빠질수밖에 없습니다.

아무리 잘 설계 하고 분리 하여 개발 하여도 말이죠.


그런걸 해결 하기 위하여 Promise란것이 세상에 나왔습니다.

당연히 불행하게도 MS의 IE에서는 그런 기능이 빠진체로.


IE를 무시 하고 싶을정도로 매력적인 Promise 기능에 대해 한번 알아보겠습니다.


먼저 콜백에 대해 얘기 해 봅시다.

콜백을 사용 하는 이유는 비동기 프로그래밍을 위하여 사용을 하게 되죠.


"A라는 행위가 끝나면 B를 실행 해라."


이걸 프로그램으로 표현을 하면 아래와 같습니다.


function A(callback){

    if(typeof callback == 'function'){

        callback();

    }

}

function B(){}


A(B);


그러면 만약에


"A라는 행위가 끝나면 B라는 행위를 하고 ,또 B라는 행위가 끝나면 C라는 행위를 하고, 또 다시 C라는 행위가 끝나면 ..."


이것 또한 프로그램으로 표현을 하면 아래와 같습니다.


function A(callback){

    if(typeof callback == 'function'){

        callback();

    }

}

function B(callback){

    if(typeof callback == 'function'){

        callback();

    }

} 

function C(callback){

    if(typeof callback == 'function'){

        callback();

    }

} 

function D(callback){

    if(typeof callback == 'function'){

        callback();

    }

} 

function E(){}


A(B(C(D(E))));

또는

 1 (function(){

 2    function(){

 3        function(){

 4            function(){

 5                function(){

 6                }

 7            }

 8        }

 9    }

10 });


여기까지는 문제가 없어보입니다.




그러나!

만약에 C 함수쯤이나 4번째 줄쯔음에서 문제가 발생 하면?

자바스크립트의 비동기 프로그램에서는 디버깅을 하기 어렵다는 단점이 있기 때문에

"왜? 무엇 때문에 멈췄지? 왜 안되지?" 라는 의문과 스트레스를 겁나 받게 됩니다.


자. 이제 Promise를 통해 위 예제를 풀어보겠습니다.


먼저 "A라는 행위가 끝나면 B를 실행 해라."

 

function A(resolve,reject){

try{

resolve();​   // 정상 실행 시

}catch(err){

reject();​     // 오류발생시

}

}

function B(){}

 

​var promise1 = new Promise(function(resolve, reject){

A(resolve,reject);

});

 

promise1 ​.​then(function(value){

    B();

});

 

소스가 길어졌습니다.^^; 하하하;;

손가락의 수고가 늘어났지만 스트레스와 유지보수의 용이성, 소스의 간결함이라는것을 얻게 됐습니다.^^


하지만.

"A라는 행위가 끝나면 B라는 행위를 하고 ,또 B라는 행위가 끝나면 C라는 행위를 하고, 또 다시 C라는 행위가 끝나면 ..."

 

function A(resolve,reject){

try{

resolve();​   // 정상 실행 시

}catch(err){

var reason = "오류발생";

reject(reason​);​     // 오류발생시

}

}

function B(resolve,reject){

try{

resolve();​   // 정상 실행 시

}catch(err){

var reason = "오류발생";

reject(reason​);​     // 오류발생시

}

} 

function C(resolve,reject){

try{

resolve();​   // 정상 실행 시

}catch(err){

var reason = "오류발생";

reject(reason​);​     // 오류발생시

}

} 

function E(resolve,reject){

try{

resolve();​   // 정상 실행 시

}catch(err){

var reason = "오류발생";

reject(reason​);​     // 오류발생시

}

} 

function E(resolve,reject){

try{

resolve();​   // 정상 실행 시

}catch(err){

var reason = "오류발생";

 

reject(reason​);​     // 오류발생시

}

} 

 

function F(){}

 

var promise1 = new Promise(function(resolve, reject){

A(resolve,reject);

}); 

var promise2 = new Promise(function(resolve, reject){

B(resolve,reject);

}); 

var promise3 = new Promise(function(resolve, reject){

C(resolve,reject);

}); 

var promise4 = new Promise(function(resolve, reject){

D(resolve,reject);

}); 

var promise5 = new Promise(function(resolve, reject){

E(resolve,reject);

}); 

 

Promise

.all([promise1,promise2,promise3,promise4,promise5])

.then(function(values){

F(values);

}).catch(function(reason){

console.log(reason);

});

 

위 코드를 풀어서 설명을 하게 되면

"A라는 행위가 끝나면 B라는 행위를 하고 ,또 B라는 행위가 끝나면 C라는 행위를 하고, 또 다시 C라는 행위가 끝나면 ..."​와 같습니다.

 

어떻습니까.. 참 쉽죠?ㅋ

 

아래 링크는 Mozilla에서 공개한 Promise 문서입니다.

참고 하여 봐주세요.^^


https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise

 

 

스펙EDIT

스펙상태설명
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Promise' in that specification.
StandardECMA 표준에서 초기 정의.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Promise' in that specification.
Draft 

브라우저 호환성EDIT

 

FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support32.0(Yes)29.0 (29.0)No support197.1