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

in SteemCoinPan •  2 years ago 

안녕하세요 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 등) 설정 확인하는 방법

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

스팀잇 기본 이야기

스팀잇 심화 이야기

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

해킹과 관련된 이야기

개발과 관련된 이야기
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

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

WWW.QOO10.COM

start success go! go! go!

@banguri님이 당신을 멘션하였습니다.

https://www.steemit.com/@banguri/6-1

글에서 말씀하신 콜백은 일반 함수이고, 그 함수안에 인자로 받는게 콜백함수라고 하는게 정확하겠습니다. 참고로 콜백함수는 우리가 호출하는게 아니라 시스템이 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 개발할때 가장 놀리기 좋은 주제죠. ㅋㅋㅋ
지옥의 됐다 안됐다.ㅋㅋㅋㅋ

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

@yonggyu01님이 당신을 멘션하였습니다.

https://www.steemit.com/@yonggyu01/60