2015년 2월 2일 월요일

node 비동기 while 방식 control flow 를 처리

node 비동기 while 방식 control flow 를 처리

개요

node 로 프로그래밍 할경우 가끔 while 방식의 control flow 를 처리해야 하는 경우가 있다
문제는 node 에서는 next()로 밀어 버리기때문에 일반적인 while 방식으로 처리할수 없다는 것이다.
해서 recursive 구조를 사용할 경우 call stack error 때문에 시도 할 수 없는 경우가 많다.
하지만 아래과 같은 방식으로 처리 가능하다.

코드

function isProcessNextJob(callback){
  #db query or some other conditions
  #db.find(function(){
  #  if(spots.length){
  #   return callback(true);
  #  }else{
  #   return callback(false);
  #  }
  #})

  return callback(true);
}

function doRecursiveWork(){
  isProcessNextJob(function(result){
    console.log(result)
    if(result == false){
        return;
    }else{
      setTimeout(doRecursiveWork,0);
    }
  });
}

doRecursiveWork();

한계

물론 위의 문장도 한계가 있다 일단 this 키워드를 사용할수 없으며
call stack 을 새로 만들기 때문에 scope chain 을 사용할수 없다.
하지만 while 방식의 control flow 일 경우 위의 모든것을 감수 하고도 사용 할만한
하나의 대용쯤은 될수 있을 거 같다.

추가내용

settimeout 은 javascript engine 의 event loop 에 새로운 message 를 추가하는 방식으로 작동한다.
*일반적인 함수 호출은 스택위에 싸이는 방식으로 작동