2014년 6월 13일 금요일

node async parallel error 처리시 주의사항

async.parallel([
      function(callback){//1번펑션
         async.parallel([
             function(callback){
                작업1
             },
             function(callback){
                작업2
             }
         ],
         function(err, results){
             
         });
      },
      function(callback){//2번펑션
        async.parallel([
            function(callback){
              작업3
               callback(new Error())
            },
            function(callback){
               작업4
            }
          ],
          function(err, results){

          });
      }
  ],
  function(err, results){
    if(err) res.send(404);
  });

}

페레럴은 동시에 작업을 처리한다.

문제는 아래와 같은 상황에서 발생된다.

1번 펑션은 작업 1까지 처리 되었고
2번 펑션에서 작업 3번후 에러가 발생했을때 이다.

이때 에러가 발생 되었음으로 마지막 펑션을 호출하고 페이지는 리턴된다.

그 후 작업 2가 진행된다.

*즉 에러가 발생 될 경우에 다른 작업이 완료되지 않았어도 마지막 펑션이 호출된다.

그럼 어떻게 사용해야 되는가? 로직에 따라 그냥 에러는 던지지 않고 무조건 널을 리턴하고


async.parallel([
      function(callback){
         callback(null,isSuccess)
      },
      function(callback){
         callback(null,isSuccess)
      }
  ],
  function(err, results){
     if(results 체크){
       res.send(400)
     }
  });

}

callback 함수의 파라미터에 isSuccess 등의 속성을 던져서 마지막 results 부분에서 처리하면 된다

map 등 내부적으로 parallel 을 사용할때는 한번더 생각해보자~