2014-08-28 3 views
2

Node.js에서 일련의 비동기 작업을 수행하는 좋은 방법은 무엇입니까? 이것은 스크립트 유형의 응용 프로그램, 즉 명령 줄에서 실행 한 다음 작업을 끝내기로되어있는 응용 프로그램입니다. 백그라운드에 앉아 여러 가지 작업을 한 번에 처리해야하는 서버의 컨텍스트에는 없습니다.node.js에서 일련의 비동기 작업 수행

나는 일명 약속/A + Thenables 알고 있지만, 구문은 그 좋은하지 않습니다 우리는 더 많은 작업을 할 때

do_some_stuff().then(
    function() { 
     do_some_other_stuff().then(
      function() { 
       do_the_last_stuff().then(
        function() { 
         // we are done with everything! 
        } 
       ) 
      } 
     ) 
    } 
); 

하면 들여 쓰기이 상당히 예쁘게 만들 것입니다.

jasmine이 비동기 작업을 수행하는 방법을 좋아합니다. 비동기 작업이 완료되면 호출해야하는 함수가 전달됩니다. 이 아이디어를 바탕으로 AsyncSequence라고하는 무언가를 만들었습니다. AsyncSequence는 일련의 작업을 실행하고 각 작업은 완료시 호출해야하는 done 함수를 전달받습니다. 위의 AsyncSequence 사용하여과 같습니다

AsyncSequence.run(
    function(done) { 
     do_some_stuff().then(done); 
    }, 
    function(done) { 
     do_some_other_stuff().then(done); 
    }, 
    function(done) { 
     do_the_last_stuff().then(done); 
    }, 
    function() { 
     // we are done with everything! 
    } 
); 

이 작동하고 내가 생각하는 멋진 외모,하지만 난 그 일을 더 "표준"방법이 있는지 궁금해? Node.js 프로그래머에게 노련 해 졌을 때 마음에 떠오르는 AsyncSequence와 비슷한 것이 있습니까? 아니면 정확히 동일하지는 않지만 동일한 목적으로 사용될 수있는 것인가? 약속/A +와

+1

는 –

답변

3

, then이 첫 번째 예를 만드는 체인 연결 할 수 있습니다

do_some_stuff() 
.then(do_some_other_stuff) 
.then(do_the_last_stuff) 
.then(function() { 
    // we are done with everything! 
}); 

나중에해야합니다 값의 컨테이너로 약속을 살펴보면를 then 다른로 미래 가치를 변환 값 (종류 : [].map). 그러나 then에 전달하는 함수가 또 다른 약속을 반환하면 래핑되지 않습니다. 더 구체적인 예를 들면 다음과 같습니다.

getPostData(req).then(function(data) { 
    return createNewUser(data); 
}).then(function(user) { 
    return JSON.stringify(user); 
}).then(function(json) { 
    return successResponse(json); 
}).then(function(body) { 
    res.end(body); 
}); 

이 예에서는 흐름을 좀 더 분명하게 나타 내기 위해 명시 적 함수 매개 변수를 사용합니다. createNewUser은 데이터베이스에 저장된 User 객체를 나타내는 약속을 반환하지만 JSON.stringify은 물론 String을 반환합니다. Promises/A +는 두 가지 종류의 반환 값을 처리하고 연결할 수 있습니다.

+0

을 https://github.com/caolan/async 유사한 것 같습니다 그러나 작업 자체는 비동기 어떤 경우? createNewUser가 외부 서비스를 호출해야한다고 가정하면 어떻게 작동할까요? –

+0

@MikaelLindqvist 그건 "비동기"기능과 함께 사용되는 약속의 핵심입니다. 다음'.then'은 사용자가 생성 될 때까지 기다립니다. – rollingBalls

+0

새 사용자를 만들면 약속을 반환해야합니다. 차례 차례로 묶을 수 있습니다 – Max

1

비동기 모듈을 사용하십시오. watefall 메소드를 참조하십시오. 당신이 쓴 무엇 https://github.com/caolan/async

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

예, 매우 비슷하지만 유감스럽게도 콜백은 약속과 작동하지 않습니다. 나는 할 수 없다 : async.waterfall ([function (cb) {some_op.then (cb)}]); 왜냐하면 콜백은 성공시 첫 번째 매개 변수로서 null을 기대하기 때문이다. –

+0

약속을 고수하려면 매트와 같은 약속 체인을 사용해야합니다. 노드 생태계는 콜백을 중심으로 구축되므로 약속 사용에 대해서는 확실해야합니다. – Max