2014-02-07 2 views
1

문제를 해결하기 위해 Node.js의 async 모듈을 살펴보고 있습니다. Node.js의 async.parallel() 동기식 호출이 동기식입니까?

var async = require("async"); 

function print(val) { 
    console.log(val); 
} 

async.parallel([ 
    function(cb){ print(1); cb(null); }, 
    function(cb){ print(2); cb(null); }, 
    function(cb){ print(3); cb(null); }, 
    function(cb){ print(4); cb(null); }, 
    function(cb){ print(5); cb(null); } 
], 
    function(err) { 
     if (err) { 
      console.error(err); 
      return; 
     } 
     console.log("Done!"); 
    } 
); 

console.log("Trulu"); 

내가 async.parallel에 대한 호출이 완료되기 전에 Trulu 로그 호출이 호출되지 않을 것이라는 점을 확신 할 수 있습니다 : 나는 약간의 테스트를 시행하고있다? 즉, Trulu 로그가 확실히 호출되기 전에 호출 된 모든 함수와 최종 콜백이 있습니까?

+1

이 나는 ​​것을 알고,하지만 내가 원하는 귀하의 질문에 대답하지 것이다 당신이 당신의 물건을 약속을 지키기 위해 포장 할 수 있다고 말하면 – Sprottenwels

+0

콜백 후 당신이 콜백에 로그를 쓰도록 할 수 있는지 확인하고 싶습니다. 그러나 나는 그것과 완료 사이의 차이를 보지 못합니다! log – CubanAzcuy

+0

async.js에 머물러 있다면, 원하는 작업을 수행하는 시리즈 메소드가 있습니다. –

답변

3

async.parallel 호출이 완료되기 전에 Trulu 로그 호출이 호출되지 않을 수 있습니까?

통화 자체, 예.

는 문서가 그것을 언급하지 않는하지만 모든 기능이

나는 그렇게 생각한다. 그러나 나는 기존 코드를 깨뜨릴 가능성이 있기 때문에 변경을 기대하지 않습니다.

그리고 마지막 콜백은 Trulu 로그가 확실히 호출되기 전에 호출됩니까?

아니요. 사용자는 기능을 알지 못하고 비동기 일 때 최종 콜백은 Trulu 이후에 실행됩니다. 모든 기능이 동기식이면 async을 사용하면 안됩니다. 사실, async.js하면서 "asynchronified"입니다 (식별 불행하게도 하드) setImmediateinternally 그래서 일부 콜백을 사용하지, 아직 테이너 stated : 예, 제작 기능 비동기가 개발자에게 달려있다

콜백이 항상 비동기 적으로 호출되도록하려면 (Trulu 이후) 함수가 동기식 인 경우에도 A+ compliant Promises을 사용하는 것이 좋습니다.

+0

첫 번째 생각은 틀렸지 만 통화가 모두 동기식이므로 'Trulu'가 '완료'다음에 호출됩니다. +1 – A1rPun

3

짧은 대답 : 아니요 비동기입니다.

긴 대답 : 당신이 parralel 콜백 내부 비동기 아무것도 수행으로

즉시, 당신은 기대할 수 Trulu은 immediatly 후 전화를받을 수 있습니다. cb에 전화하면 함수가 반환되었음을 알립니다. 모든 함수가 반환되면 마지막 콜백이 호출됩니다.

따라서 시간이없이 setTimeout을 수행하고 각 함수가 asynchrone없이 반환하는 경우 Javascript는 한 번에 하나의 단위 만 실행하기 때문에 동기식으로 동작 할 수 있습니다. 그리고 그것들은 아마도 순서대로 시작 되었기 때문에 동 기적으로 움직이는 것처럼 보일 것입니다.

예로 들어이 걸릴 :의 setTimeout이 트리거되지 얻을 않을 것 같은

var looping = true; 

setTimeout(function() {looping = false;}, 1000); 

while(looping) { 
    ... 
} 

이 코드는 떠나지 않을 것입니다. async.parralel에서는 현재 유닛이 실행 완료된 후에 각 콜백이 실행될 것이라는 것을 거의 확신합니다. 즉, async.parralel 안에 콜백이 있기 전에 항상 console.log("Trulu")이 실행됩니다.

당신이 동기 일을 찾고 있다면, 당신은 비동기라는 모듈을 사용하면 안됩니다. 비동기이 될 것입니다.

즉, 나는 async이라는 용어에 대해 큰 오해가 있다고 느낍니다. 비동기 적 (Asynchronous)은 횡성 궤적에 대한 동의어가 아니거나 동시에 일을하는 것과 같습니다. Asynchrone은 "제 시간에 질서없는"것을 의미합니다. 동시적일 수도 있지만 순차적 일 수도 있습니다. Javascript에서 비동기 코드를 실행하려면 이벤트 루프를 사용해야합니다.

이벤트 루프는 한 번에 하나의 이벤트 만 처리 할 수 ​​있으며 setTimeout은 루프에 이벤트를 넣기 만합니다. 이벤트 처리기가 종료되자 마자 다음 이벤트로 넘어갑니다.

귀하의 경우 이벤트 처리기 내에서 cb을 호출하지 않으므로 현재는 event을 떠나지 않으므로 동 기적으로 호출됩니다.

+1

그들은 함수 자체가 비동기적인 작업을 수행하지 않는 한, 그가 말하는 [비동기 라이브러리 (비동기식) (https://github.com/caolan/async) (이상하게)]와 비동기 적으로 보이지 않습니다. 실험이나 코드를 살펴보면 함수 자체가 비동기적인 작업을 수행하지 않는 한 함수가 실제로 병렬로 실행된다는 것을 알 수 없습니다. 예를 들어, 'async.parallel' 함수는 동 기적으로 * 함수를 호출하지만, 비동기식 작업을 수행한다고 가정합니다. 솔직하게 이상하게 보입니다. –

+0

@ T.J.Crowder 그래, 내가 설명하는 것을 알고있다 –

+0

@ T.J.Crowder : JS는 동시 함수를 병렬로 실행할 수 없다. 그래서 당신은 무엇을 기대할 것이다 :-) – Bergi

1

async를 이미 사용하고 있으므로 async에 series 호출이 있습니다. 나는 이것이 당신이 찾고있는 무엇을 할 수 있다고 생각하지만, (내 의견 async.js에 본질적으로 엉망이있게 때문에) 경고,이 못생긴 :

async.series([ 
    parallel, 
    function(callBack){ console.log("Trulu"); callBack(null); } 
]); 

function parallel(callBack){ 

    async.parallel([ 
    function(cb){ print(1); cb(null); }, 
    function(cb){ print(2); cb(null); }, 
    function(cb){ print(3); cb(null); }, 
    function(cb){ print(4); cb(null); }, 
    function(cb){ print(5); cb(null); } 
    ], 
    function(err) { 
     if (err) { 
      console.error(err); 
      return; 
     } 
     console.log("Done!"); 
     callBack(null); 
    } 
); 
} 

솔직히, 나는 일반적으로 비동기 모듈을 생각한다 자바 스크립트가 네이티브보다 훨씬 복잡해지고 있습니다. 비동기 모듈을 전혀 사용하지 않고 원하는 작업을 수행하는 방법을 보여주는 답변을 원하면 알려 주시기 바랍니다.

또 다른 간단한 해결책은 async.parallel의 콜백에 내장 된 후에 실행하려는 마지막 호출을 구축하는 것입니다 :

async.parallel([ 
    function(cb){ print(1); cb(null); }, 
    function(cb){ print(2); cb(null); }, 
    function(cb){ print(3); cb(null); }, 
    function(cb){ print(4); cb(null); }, 
    function(cb){ print(5); cb(null); } 
], 
    function(err) {   
     if (err) { 
      console.error(err); 
      return; 
     } 
     console.log("Done!");   
     console.log("Trulu"); // Executes after all your "parallel calls" are done 
    } 
); 
+0

비동기없이이를 수행하는 방법을 설명해 주시겠습니까? – user3248186

관련 문제