[NodeJS] API 사용 법 9편 Nodejs가 가지는 불편함 (콜백지옥)

안녕하세요 ayogom 입니다.
어제 [NodeJS] API 사용 법 8편 스팀 블럭 모니터링 하기 2편 포스팅을 올리며, 내용 중에 이러한 언급을 했는데요.

사실 이 코드에는 한가지 매우 불편한점이 하나 있는데요 어떻게 보면 nodejs의 특성이 묻어납니다. 내일은 이 부분에 대해서 이야기를 좀 드리겠습니다.

이 이야기는 조금 더 거슬러 올라가면 Nodejs 가 무엇인지 그리고 어떻게 설치 하는지? 에서도 볼 수 있습니다.

그것은 바로 callback 을 동작시켰을 때

동시다발 적으로 코드가 돌아간다는 점이죠

이제 다시 어제 소스코드를 한번 봐볼까요?

var steem = require('steem');

steem.api.streamBlockNumber('head',function(err, result){
        console.log(err, result);
        steem.api.getBlock(result ,function(err, result){
            for (var i=0;i<result.transactions.length;i++){ 
                console.log(result.transactions[i].operations[0][0]);
            }
        })      
});

현재 이 코드에는 streamBlockNumbergetBlock 이렇게 총 2개의 콜백이 있습니다.
코드를 살펴보면 먼저 streamBlockNumber이 수행되고 그 수행이 끝나기 전에 다시 한번 콜백을 호출하게 됩니다. 이걸 만약 일반적인 C와 같이 streamBlockNumber이 종료 되고 그 다음 getBlock을 아래와 같이 수행시킨다면 그 결과값이 다르게 될 것입니다.

var steem = require('steem');

steem.api.streamBlockNumber('head',function(err, result){
        console.log(err, result);
});

 steem.api.getBlock(result ,function(err, result){
         for (var i=0;i<result.transactions.length;i++){ 
             console.log(result.transactions[i].operations[0][0]);
         }
});      

아마도 어쩌면 값이 동일하게 나올 수도 있고, 안나올 수도 있습니다. 나온다면 뭐야? 똑같잔아 생각할 수 있지만 그건 그냥 해당 callback 함수가 너무 빠르게 끝나서 발생하는 우연일뿐입니다. 다음에 동일한 코드를 동작시켰을때 안되는 경우가 생길 수 있습니다.

그게 Nodejs 입니다.

물론 이 것을 해결하는 방법이 있습니다. 바로 promise,async,await 를 사용하는 방법인데, 해당 방법은 추후에 다시 다룰 것입니다. 지금 설명해봐야.. .아마도 크게 와닿지 않으실껍니다 ㅎㅎ 그래도 잊을만 하면 다시 한번 소개해드리겠습니다.

내일은 간단한 댓글 봇 혹은 보팅 봇을 만들어 보겠습니다.

작성 예정인 글 List

  • Nodejs 를 이용한 스팀 API 사용해보기 (계속)
  • SCT 포스팅피 납부 방법
  • 니트로스별(SCT, ZZAN, AAA 등) 설정 확인하는 방법

누군가에게는 도움이 될 수 있는 글

스팀잇 기본 이야기

스팀잇 심화 이야기

스팀잇 보상과 연결되는 이야기

해킹과 관련된 이야기

개발과 관련된 이야기
Sort:  

[US$80.50](▼16%)[SONGJING]SONGJING SJ-125E 제습기 / 송징 SJ-125E 제습기 / 36평적용 / 165W 고출력 / 대용량 물탱크 / 관부가

WWW.QOO10.COM

start success go! go! go!

글에서 말씀하신 콜백은 일반 함수이고, 그 함수안에 인자로 받는게 콜백함수라고 하는게 정확하겠습니다. 참고로 콜백함수는 우리가 호출하는게 아니라 시스템이 call back하기 때문에 콜백함수로 불립니다. 글에서 조금 분명하지 않은 부분이 있어서 댓글답니다.

첨언 감사합니다!

항상 양질의 포스트 잘 보고 있습니다. 감사합니다!

저도 정확한 이해를 하기 위해서 다시 한번 문의를 드립니다 ㅎㅎ

해당 코드 내에서 Steem 라이브러리를 콜백하기 때문에
streamBlockNumber과 getBlock 을 콜백함수로 이해하고 있는데요.
그 이해가 맞는거죠?

streamBlockNumber의 함수는 일반함수입니다. 그 안에 넣는 인자를 보시면 2번째에 function이 들어갑니다. 이게 콜백함수입니다. streamBlockNumber함수가 즉시 블락넘버를 얻어오는 함수가 아니라서 결과가 나왔을 때 처리해주는 함수를 지정해 준 것입니다.

@ayogom transfered 5 KRWP to @krwp.burn. voting percent : 4.19%, voting power : 59.93%, steem power : 1779883.64, STU KRW : 1200.
@ayogom staking status : 700 KRWP
@ayogom limit for KRWP voting service : 0.7 KRWP (rate : 0.001)
What you sent : 5 KRWP
Refund balance : 4.3 KRWP [54242960 - 2b415b8a2750f8e573d26ca29a09b9e8f7594dda]

우리 회사 막내가 요즘 promise 개념 이해못해서 지옥에 빠지고 있던데 ..
node 개발할때 가장 놀리기 좋은 주제죠. ㅋㅋㅋ
지옥의 됐다 안됐다.ㅋㅋㅋㅋ

ㅋㅋㅋㅋㅋㅋ 사실 저도 한동안 그 개념을 이해하고싶지 않아서 (?)
콜백 지옥으로 코드를 짜다가 도저히 못봐주겠어서... 최근에 억지로(?) 이해를 했습니다