what is Promise? 2.비동기 처리의 처리

zenibako.lee
8 min readOct 14, 2019

--

callback , promise 콜백, 프로미스 자바스크립트

비동기처리의 완료시점에 특정 코드를 실행하도록 하는 방법에 대해 알아보자.

첫번째는 callback 함수를 이용하는 방법이다.

Callback Function

콜백은 이리도 반가운 표정을 짓게 만드는 단어이다.

https://giphy.com/gifs/lalaland-la-land-xUA7aWmr0uddsafLEI

부재중 전화가 와있는 경우, 그걸 확인하고 걸어주는 call, callback이다.

callback function의 경우도 그 개념에 나온게 아닐까..생각된다.

비동기함수가 완료된 경우, 미리 입력된 callback function을 알아서 실행시키는 개념.

코드로 알아보자.

function printString(string, callback){
setTimeout(
() => {
console.log(string)
callback()
},
Math.floor(Math.random() * 1000)
)
}

printString function은 string과 callback을 파라미터로 받는다,

그리고 function(){console.log(string) callback()}이라는 펑션을

랜덤second 이후 실행한다.

처음에 입력받은 callback을 비동기함수(랜덤초 대기) 이후 실행한다.

function printAll(){
printString("A", () => {
printString("B", () => {
printString("C", () => {})
})
})
}

위에서 만든, 랜덤초 이후 입력받은 string을 출력하는 펑션을 계속 콜백으로 중첩되어 받아 실행하는 printAll()을 실행해보면,

순차적으로 완료되는 것을 확인할 수 있다.

위와 같이,

뭔가 시간이 걸리는 작업을 지원하는 method나 package는 이러한

콜백함수를 기본적인 파라미터 문법에 포함시키고 있는데,

예를들면

http 요청을 간단하게 지원하는 request라는 package를 보면 알 수 있다.

const request = require('request');request('http://www.google.com', function (error, response, body) {
console.error('error:', error);
// Print the error if one occurred
console.log('statusCode:', response && response.statusCode);
// Print the response status code if a response was received
console.log('body:', body);
// Print the HTML for the Google homepage.
});

request메소드를 간단하게 나눠보면

request('url', callback(error,response,body){})

이렇게 볼 수 있다.

url로 http request보내고, 해당 작업이 완료되었을 때,

콜백을 실행하여 받아온 http respons, 혹은 error정보에 대해 접근 할 수 있다.

그런데 프로미스가 뭐냐고.. 어떻게 사용하냐고..

https://giphy.com/gifs/benedict-cumberbatch-wink-b44FwP4st6v3G

바로 위의 request예제를 Promise객체를 사용하는 방식으로 바꿔보겠다.

function getData(url){return new Promise(function(resolve,reject){
request('url',function(err,res,body){
if(err){
reject(err);
}else{
resolve(''+body);
}
}
}
}

뭔가 굉장히 길어졌다. 무엇?

getData라는 펑션은 데이터를 받아올 url을 파라미터로 받는다.

그리고 Promise생성자를 이용해 만든 Promise객체를 return한다.

그 생성자는 resolve와 reject를 파라미터로 갖는 펑션을 인자로 갖는다.

resolve와 reject가 뭔데? 누가 어디서 주입해준거야?

resolve와 reject는 Promise생성자에 들어가는 콜백function(executor)

에 내장된 문법이다.

이 executor는 Promise가 실행되는 즉시 실행이 되며, resolve와 reject는 이 프로미스 작업의 완료 시점에 해당 Promise작업의 상태(결과)를 return하기 위해 호출된다.

프로미스는 어떠한 상태를 갖는데?

프로미스는 무조건 3가지 상태중에 하나에 속한다.

  • Pending — 최초 state시 상태
  • fulfilled — 연산이 성공적으로 완료됨
  • rejected — 연산이 실패함

fulfilled의 경우를 처리하기 위해서

resolve(받아온 결과)를 하면,

받아온 결과를 return하며, fullfiled상태로 바뀐다.

rejected의 경우는

reject(error객체)를 하면,

발생한 에러객체를 return하며, rejected상태가 된다.

.then 이후 catch로 해당 에러객체를 받을 수 있다.

https://giphy.com/gifs/movie-black-and-white-film-t0sT1i7DTexzy

프로미스 객체를 이용하는 사용법들을 알아 보자

1.then(function)

function getData(url){return new Promise(function(resolve,reject){
request('url',function(err,res,body){
if(err){
reject(err);
}else{
resolve(''+body);
}
}
}
}
getData('http://www.naver.com')
.then(function(html){
console.log('받아온 html',html)
})
.catch(function(err){
console.error(err)});

.then은 프로미스 객체를

대상으로 하는 메소드이다, 그리고 파라미터로 promise결과를 받는

콜백 함수를 갖는다.

2. Promise Chaining

getData('http://www.naver.com')
.then(function(html){
return html+1;
})
.then(function(html){return html+1;
})
.then(function(html){return html+1;
})
.then(function(html){return html+1;
})

이런식으로, 앞의 then에서 처리한 결과를 return하고,

해당 return값에 대해 임의로 정한 파라미터명으로 받아서

후속적인 처리가 가능하다.

다음 글에서는,

자바스크립트가 비교적 최신버젼에서 도입하고, 권장하고 있는

Async/Await를 통해 비동기처리 처리를 어떻게 하는지 알아보자.

참고

--

--

zenibako.lee
zenibako.lee

Written by zenibako.lee

backend engineer, JS, Node, AWS

No responses yet