2014-12-03 2 views
0

Process1() 함수에 데이터베이스 루프가 있으므로 Process2()Process3() 번 이상 호출하는 중입니다. async에 어떤 기능을 사용하여 for loop을 기다려야합니까?Node.Js 비동기 사용법

async.waterfall([ 
    function(callback){ 
     Process1(yyy, function(){ 
      //process1 function has a for loop. 
      callback(); 
     }) 
    }, 
    function(callback){ 
     Process2(function(){ 
      // so process2() is calling more than once 
      callback(); 
     }) 
    } 
], function (callback) { 
    Process3() 
}); 

Process1() : 호출이 다시 일어날 때까지 lodashunderscore 대기하지 않기 때문에 코드를 보면

function Process1(yyy, pass){ 
user.find({}).exec(function(e, users){ 
    _.each(users, function(_user){ 
     user.findOneAndUpdate(
      {'_id' : user_id}, 
      {$inc : {'xxx' : yyy}}, 
     function(e){ 
      !e && pass() 
     }) 

    }) 
}) 
} 
+0

항상 'for' 루프를 기다립니다. 해야만합니다. – Brad

+0

하지만'process2' 전에 데이터베이스 프로세스를 실행해야합니다. 어떤 해결책이 없습니까? @ 브래드 감사합니다. – Lazy

+0

여기에 표시된 코드를 사용하면 문제가 해결됩니다. 'Process2'는 첫 번째 클로저에서'callback'이 호출 될 때까지 실행되지 않습니다. – Brad

답변

1

Process2 확실히, 두 번 이상 호출됩니다. 그것들은 단지 유틸리티 방법 일뿐입니다.

asynchronous 상황을 해결하려면 async.each 또는 async.eachSeries을 사용하십시오.

function Process1(yyy, pass){ 
    user.find({}).exec(function(e, users){ 
    async.each(users, function(_user, next){ 
     user.findOneAndUpdate(
      {'_id' : user_id}, 
      {$inc : {'xxx' : yyy}}, 
     function(e){ 
      !e && next() 
     }) 
    }, function(err) { 
     pass(); 
    }) 
    }) 
} 
+0

고맙습니다. 비동기 사용법을 이해했습니다. – Lazy