2012-09-10 5 views
8

내 첫 번째 "심각한"Node.js 프로젝트 (Express 사용) 빌드하기.Node.js의 API에 대한 비동기 호출 패턴

몇 가지 REST API에 대한 호출을 여러 개 사용하고 모든 결과를 수집하고 마사지 한 후 클라이언트 (HTML5 + AJAX)에 전체 JSON을 반환해야합니다.

  1. 통화 API JSON에 3 개 통화에서
  2. 처리 결과
  3. response.send (결과) (B의 결과로) 다시
  4. 통화 API의 B
  5. 통화 API A를

확실한 패턴/솔루션/모듈이 있기를 바랄뿐입니다. 정확하게 Google을 사용하지 못했습니다. 의견도 환영합니다. n 이러한 작업을 배치 할 위치 ('routes'아래? 별도의 파일? 등)

시간 내 주셔서 감사합니다!

+0

이 그냥 일반적인 비동기 프로그래밍 질문입니다. 나는 그것 (섬유, 비동기 라이브러리, 이벤트 핸들링)을 다루는 방법이 많이 있기 때문에 stackoverflow에 잘 맞지 않는다고 생각한다.당신은 맹목적으로 명명되었지만 매우 유용한 Q 라이브러리와 함께 약속을 사용해야 만합니다. 이것은 의견이 분명한 답변이므로 주석으로 남겨 두겠습니다. 이 질문이 지금 당장 닫히기를 바랍니다. –

+5

@AndyRay 질문을 닫을 수없는 것은 좋은 일입니다. – Tomalak

+0

@AndyRay 일반적인 질문을하는 것에 대한 규칙은 없습니다. 노드를 올바르게 만드는 방법을 배울 때 가장 좋은 도구를 찾고 있습니다. 답을 얻은 경우 하나만 남겨 두십시오. 제공 한 솔루션에 대해 자세히 알아보고 기꺼이 받아 볼 수 있습니다. 질문에 대한 답변을 이미 알고 있기 때문에이 전체 사이트의 목적을 능가합니다. –

답변

8

async 모듈은 이러한 종류의 작업에 적합합니다. 특히 async.waterfall 함수를 사용할 수 있습니다.

예 : 작업 사이에 사소 의존성이있는 경우

async.waterfall([ 
    function(callback){ 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback){ 
     callback(null, 'three'); 
    }, 
    function(arg1, callback){ 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done'  
}); 

편집, 당신은 async.auto를 사용할 수 있습니다. 요구 사항에 따라 기능을 실행하는 데 가장 적합한 순서를 결정합니다.

+0

+1 나는 똑같은 대답을 쓰고있다. 한 가지 빠진 점은 1, 2 및 3의 모든 결과를 4 단계로 가져 오는 방법을 나타내는 것입니다. – Tomalak

+0

내가 찾고있는 것처럼 보입니다. 하나의 질문 : 비록 .water와 .parallel을 결합 할 수 있습니까? 나는. 모든 전화를 병렬로 연결하고 서로 의존하는 전화를합니까? 몇 가지 흥미로운 의존성과 함께 3 개 이상의 호출이 있습니다 ... –

+3

@TravelingTechGuy 그렇다면 [async.auto] (https://github.com/caolan/async#auto)를 사용할 수 있습니다 – qiao

2

주위에는 많은 제어 흐름 라이브러리가 있습니다. 저는 이전 프로젝트에서 Q를 사용했습니다. 불만은 없지만 다음 프로젝트에서 caolan으로 비동기 라이브러리를 사용할 것입니다.

위에서 설명한 것과

https://github.com/caolan/async

, 당신은 아마

https://github.com/caolan/async#parallel

는 당신이 설명하는 문제는 아주 쉽게 병렬로 전송할 수 있습니다 병렬 기능을 사용하여보고 싶어 문서의 예

EDIT : API 호출이 종속적 인 문제에 대해 놓친 것 같습니다. 체인을 따라 값을 전달하고 순서를 제어해야 할 때마다 waterfall 메서드를 사용해야합니다 (qiao의 대답 참조). 호출이 독립적 인 경우 병렬 처리 방법을 사용합니다. 병렬 메소드의 예는 다음과 같습니다.

async.parallel({ 
    google: function(callback){ 
     http.get("http://www.google.com", function(res){ 
     console.log("google done"); 
     callback(null, res.statusCode); 
     }) 
    }, 
    yahoo: function(callback){ 
     http.get("http://www.yahoo.com", function(res){ 
     console.log("yahoo done"); 
     callback(null, res.statusCode); 
     })  
    } 
    }, 
    function(err, results) { 
    if(!err){ 
     console.log("all done"); 
     console.log(results.google); 
     console.log(results.yahoo); 
    }else{ 
     console.log(err); 
    } 
    } 
); 

이것은 모든 요청을 병렬 처리하고 모두 완료 될 때 콜백을 제공합니다. 이것은 데이터를 마사지하는 곳입니다. 제어 흐름 라이브러리의

목록 :

https://github.com/joyent/node/wiki/Modules#wiki-async-flow

+1

에서 약속 이외의 체인 연결 솔루션을 찾고 있었기 때문에'parallel()'는 작동하지 않습니다. a) 정의 된 시퀀스의 단계를 실행하지 않고 b) 결과를 전달할 방법이 없기 때문입니다. 한 기능에서 다음 기능으로. – Tomalak

+0

고마워요. 편집 내 대답 – wdavo

+0

그것은 순서에 대해서만 아니에요. 또한 한 단계에서 다른 단계로 결과를 전달하는 것입니다. 'parallel()'그냥 그게 옳지 않습니다. – Tomalak

관련 문제