2013-07-10 2 views
4

나는 몽구스를 아주 좋아하므로 제발 참아주십시오.몽구스에서 평행 한 "Query"를 수행하려면

두 개의 쿼리를 "병렬"방식으로 수행 할 수 있습니까? 또는 적어도 두 개의 문서를 쿼리하고 그 결과를 함께 반환합니까? 콜백 표기법으로 동기화가 다소 지연됩니다. 이 의사 코드에서

내가 무엇을 찾고있다 :이 때문에 doQueryAndReturnTask에 콜백을 필요로 솔루션 아니라는 것을 알고

function someWork(callback) { 
    var task1 = service.doQueryAndReturnTask(); 
    var task2 = service.doQueryAndReturnTask(); 

    waitAll(task1, task2); 

    callback(task1, task2); 
} 

,하지만 난 작동 패턴 referrable 필요 콜백을 연결하지 않습니다

답변

11

몽구스에 관한 이야기가 아닙니다. Node.js는 비동기 언어이므로 동시에 여러 번 비동기 작업 (예 : 데이터베이스 쿼리)을 실행할 수 있습니다.

var when = require('when'); 

var someWork = function(callback) { 
    when.all([ 
    collection1.find(query1).exec(), 
    collection2.find(query2).exec() 
    ]).spread(callback) 
    .otherwise(function(err) { 
     // something went wrong 
    }); 
}; 

when.js이 약속을 처리하는 모듈입니다 : 당신이 필요로하는 무엇

async.js 또는 when.js 같은 비동기 제어 흐름을 처리 할 수있는 몇 가지 lib 디렉토리입니다. 당신이 약속을 필요로하지 않는 경우에 따라서, 대신 async.js을 사용할 수 있습니다 :

var async = require('async'); 

var someWork = function(callback) { 
    async.parallel([ 
    function(cb) { collection1.find(query1, cb) }, 
    function(cb) { collection2.find(query2, cb) } 
    ], function(err, res) { 
    if (!err) return callback.apply(null, data); 
    // something went wrong 
    }); 
}; 

업데이트 : 약속은 약속 비동기 기능을 래핑하여 비동기 제어 흐름을 처리 할 수있는 다른 방법입니다.

일반적으로 일부 비동기 함수의 결과를 얻으려면 향후 콜백을 전달해야합니다.

약속을 사용 중일 때 콜백을 전달하는 대신 실행 결과가 곧 어딘가에서 해결 될 것이라는 약속이 즉시 전달됩니다.

그래서 약속을 사용하면 실제 데이터 대신 약속을 사용하여 동기 방식으로 비동기 함수로 작업 할 수 있습니다. 또한 Promises를 사용하면 실행 중 언제든지 결과를 기다릴 수 있습니다.

필자는 두 가지 쿼리를 실행하여 결과에 대해 두 가지 약속을 얻고 있습니다. 그런 다음 두 노드가 결과를 callback 함수에 전달할 때까지 노드가 기다려야한다고 말하고 있습니다.

promises/A+ specification here을 읽을 수 있습니다. when.js api docs도보실 수 있습니다.

+0

약속이 무엇인지 설명하거나 참조 할 수 있습니까? – Slappy

+1

@ Slappy 나는 나의 대답을 편집하고 약속에 대한 설명을 추가했다. –