[node.js 초급코딩5] 주기적으로 댓글달기(Ft. RunKit + npm)

in #kr-dev6 years ago


image
(Thanks to: @kiwifi)

계속해서 초급코딩은 RunKit + npm 을 이용해서 진행해보겠습니다.
아무래도 웹상에서 node.js 를 돌리다보니깐 좀 제약이 있긴하네요.

오늘 다룰 주제는

주기적으로 댓글달기

입니다.

제가 주기적으로 특정 포스팅에 댓글을 달아야하는 목적(?)이 생겨서요 ㅎㅎ
RunKit 으로 가능할까 싶어서 해봤는데 잘 되는 군요.

이번 주제에서 고민해야될 내용은 비동기 함수에 loop 를 적용하는 겁니다.
해보신 분들을 아시겠지만, for 문 안에 비동기 함수를 사용하면, for 문 먼저 돌고, 맨 나중에 비동기 함수가 동작하게 되서 의도한 결과가 나오지 않는 경우들이 있습니다.

댓글도 마찬가지였습니다.
댓글다는 Steem API(steem.broadcast.comment)가 비동기이다보니 그냥 for문을 이용해서는 안되더군요 ㅠㅠ
심지어 댓글은 20초가 지나야 추가로 달 수 있기때문에 Delay 도 적용하려는데 쉽지않았습니다 ㅎㅎ

결국 적용한 방식은 Recursive function Call 입니다. 재귀함수 호출이라고도 하죠 ㅎㅎ;;
비동기 API 를 하나의 독립된 function(comment_Recur) 으로 구성하고, 비동기 API 가 끝나는 구간에 다시 이 function(comment_Recur) 을 호출하는 겁니다.
그리고, 이 함수를 재귀적으로 호출하기 전에 delay 를 코드는 넣었는데, 저는 무식하게 while 이 돌면서 시간을 체크하도록 구현했답니다.

코드는 복사 가능하도록 Text 로 표현했습니다. 보시기에는 불편하실꺼 같고, 실습용으로 사용하시면 될꺼 같습니다.

var steem = require('steem')

var objectAuthor = 'xxxxxxxx' // <= 댓글다는 포스팅 저자
var objectPermlink = 'yyy-yyyyyy-yyyyyy' // <= 댓글다는 포스팅 permlink

var author = 'kkkkkkkk' // <= 댓글다는 저자(보통 본인 계정쓰시겠죠?ㅎㅎ)
var title = '';
var post = '**************************************' // <= 포스팅 키(RunKit으로 돌리는거라 숨기고 사용할 방법이 없음 ㅠㅠ)
var body = [ // <= 댓글 Array, 추가한 수만큼 돌면서 댓글을 답니다.
"댓글 내용 1 입니다.",
"댓글 내용 2 입니다.",
"댓글 내용 3 입니다."
];
var jsonMetadata = {"tags":['kr-dev']}; // <= 댓글에 달리는 tag

function comment_Recur(i) // <= 재귀(Recursive)함수 정의
{
if( i >= body.length )
return;

permlink = author + '-' + Date.now(); // <= 각 댓글마다 permlink 를 다르게 구성해야되기때문에 날짜/시간 값으로 정의함.
steem.broadcast.comment(post, objectAuthor, objectPermlink, author, permlink, title, body[i], jsonMetadata, function(err, result) {
console.log(i);
now = Date.now();
while(Date.now() - now < 30000); // <= 무식하게 while 문으로 delay
comment_Recur(i+1); // <= 다음 재귀함수 호출
});
}

comment_Recur(0); // <= 처음 재귀함수 호출 시작~!

제가 설명 주석까지 붙였더니 좀 지저분해보이긴 하네요..? ;;;
개인적으로는 비동기함수 loop 처리를 계속 해결 못하고 있었는데 해결 방안 중 하나를 찾아서 너무 좋네요 ㅎㅎ

이전 초급코딩

[node.js 초급코드] 내 포스팅 댓글에 달린 주사위 값 조회
[node.js 초급코드2] 내 포스팅 링크 정리 Script
[node.js 초급코딩3-1] @명령어 처리(@야구 이벤트 코드)
[node.js 초급코딩3-2] @야구 이벤트 코드 두번째 이야기
[node.js 초급코딩3-3] @야구 명령어 결과 댓글 달기
[node.js 초급코딩4] Payout 이전 내 포스팅 제목/링크 가져오기(Ft. RunKit + npm)

로고.gif
(Thanks to: @kimtaewoo)

Sort:  

혹시 setInterval 로는 해결이 안될까요 ? ^^;;;

ㅋㅋ 제가 너무 무식했죠 >< javascript 를 잘 몰라서요 ㅎㅎ setInterval도 사용해보겠습니다 조언 감사합니다~:)

delay 하는 부분을 말씀하신 setInterval 로 처리하니깐 훨씬 깔끔하네요 ㅎㅎ

    setInterval(function(){ 
       comment_Recur(i+1);
   }, 30000);

이런식으로는 안될까요 ? ^^;;;

var i = 0;
function comment_Recur() {
var permlink = author + "-" + Date.now();
steem.broadcast.comment(post, objectAuthor, objectPermlink, author, permlink, title, body[i], jsonMetadata, function(err, result) {
// 블라블라...
});
}

var it = setInterval(function(){
if(i++ <= body.length) {
comment_Recur(i);
} else {
clearInterval(it);
}
}, 30000);

아 setInterval 을 하면 interval 마다 한번씩 호출하는 구조인가요? 맞다면 가능할꺼 같습니다
다시 해봐야겠네요 :)

네..저 코드는 30초마다 실행이 되고, body.length 보다 커지면 clear 됩니다. ^^
비슷한 놈으로 setTimeout 은 한번만 실행이 되는 함수이고요.

아 저는 첨이 setTimeout 으로만 했었는데 setInterval 잘 활용해봐야겠네요 감사합니다 :)

이게 어떻게 웹상에서 돌죠? 컴파일 같은 것 해야하나요?

RunKit+npm 이 javascript 를 돌려줍니다
일종의 웹어플리케이션 서버인거죠
단점은 단순 테스트만 가능하고 실제 서비스를 돌릴 순 없답니다 :)

하~ 이런쪽은 아무것도 몰라서... ㅎㅎ 수고하셨습니다^^

격려해주셔서 감사합니다~:)

오웃...뭔가 전문적이어 보인다는..ㅜㅜ
저는 워낙 이런거 몰라서 ㅋㅋ
이런거 잘하시는 분들 보면 너무 부러워요 >.<
홧팅입니닷!

응원해주셔서 감사합니다~:)

근데 좀 돌려보니깐 RunKit 에서는 프로그램 동작시간을 1분 정도로 제한하는것 같네요... 2~3개돌리면 동작이 끝나버립니다 ㅠㅠ 결국 다수의 댓글을 달려면 직접 node js 를 설치해야된다는 결론에 도달하네요;;

  • [pairplay 참여자 풀봇 이벤트] 당첨되셔서 보팅드리러 나왔습니다~. 앞으로도 잼있게 즐겨주세요~ ^^

async 나 promise 를 사용하시면 간단해집니다. ^^
개발을 하고 계셨다니 반갑네요~. 팔로우 하고 갑니다~ :)

감사합니다 개발이라고 칭하기엔 많이 부끄럽고 그냥 끄저기는 정도입니다 ㅎㅎ async 나 promise 쪽도 공부해가봐야겠네요 ㅎㅎ

코딩을 예술입니다.ㅋㅋ

제 코딩 허접 초보 코딩이에요 ㅋㅋㅋ

무럭무럭 발전하시길~~ㅋㅋㅋ

잘보고 갑니다. 보팅드려요.

Coin Marketplace

STEEM 0.20
TRX 0.13
JST 0.030
BTC 63026.81
ETH 3462.43
USDT 1.00
SBD 2.51