2013-07-10 3 views
1

당신이 알고있는 바와 같이, 이러한 코드로 정의 async.parallel는 : NodeJS + async : 어떤 제어 흐름 옵션을 선택하겠습니까?

async.parallel([ 
    function (callback) { 
     callback(err, objects); 
    }, 
    function (callback) { 
     callback(err, status); 
    }, 
    function (callback) { 
     callback(err, status); 
    }, 
], function (err, results) { 
    //smth with results[N] array... 
}); 

는 모든 작업이 모두 함께 평행 수행

. 그러나 첫 번째 함수 ( objects, 정확해야 함)의 콜백 결과는 두 번째 및 세 번째 함수에서 사용할 수 있어야합니다. 즉, 첫 번째 단계 - 첫 번째 함수, 두 번째 - (2 번째 + 3 번째 결과와 평행). 폭포 기능에

  1. 는 마지막으로, 스택의 모든 결과에 평행
  2. 내가 얻을 수없는 액세스를 작동 할 수 없습니다 : async.waterfall 나쁜 생각 '원인이 될 것으로 보인다.

아이디어가 있으십니까? 감사!

+0

병렬로 작동하지 않기 때문에이 다음 폭포입니다 (이것은 그 작업을 실행하기 전에 작업의 결과를 요구하는 것은 불가능하다) 정말로 당신이 원하는 것. 아니면 병렬과 비동기의 차이를 이해하지 못합니까? – slebetman

+0

@slebetman 그렇게 간단하게 설명하면 정말 고맙겠습니다. –

+0

@slebetman 비동기 코드는 실제로 하나의 스레드 ** 콜백 **에서 작동 할 수 있습니다. 병렬 코드는 실제 여러 스레드에서 작동합니다. 그것은 추측입니다. –

답변

1

waterfallparallel이 모두 필요합니다.

function thing1(callback) {...callback(null, thing1Result);} 
function thing2A(thing1Result, callback) {...} 
function thing2B(thing1Result, callback) {...} 
function thing2(thing1Result, callback) { 
    async.parallel([ 
     async.apply(thing2A, thing1Result), 
     async.apply(thing2B, thing1Result) 
    ], callback); 
} 
async.waterfall([thing1, thing2], function (error) { 
    //all done 
}); 
1

비동기를 사용할 필요가 없습니다. async를 사용하면 기본적으로 앱을 블랙 박스에 넣을 수 있습니다. 나는 쉬운 작업, 바닐라 JS의 마법 좋아하지 않기 때문에 :

var f1 = function (cb){ 
    ... 
    cb (null, "result from f1"); //null error 
}; 

var f2 = function (resultFromF1, cb){ 
    ... 
    cb (null); //null error 
}; 

var f3 = function (resultFromF1, cb){ 
    ... 
    cb (null); //null error 
}; 


var main = function (cb){ 
    f1 (function (error, resultFromF1){ 
     if (error) return cb ([error]); 

     var errors = []; 
     var remaining = 2; 
     var finish = function (error){ 
      if (error) errors.push (error); 
      if (!--remaining){ 
       //f2 and f3 have finished 
       cb (errors.length ? errors : null); 
      } 
     }; 

     f2 (resultFromF1, finish); 
     f3 (resultFromF1, finish); 
    }); 
}; 

main (function (errors){ 
    if (errors) return handleError (errors); //errors is an array 
    ... 
});