2013-07-10 2 views
4

Я довольно новичок в Mongoose, поэтому, пожалуйста, несите меня.Чтобы сделать параллель «Запрос» в Mongoose

Есть ли способ выполнить два запроса в «параллельном». Или, по крайней мере, запросить два документа и вместе возвратить их результаты? Обозначение обратного вызова немного сбивает меня с синхронизацией.

В псевдокоде это то, что я ищу:

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

    waitAll(task1, task2); 

    callback(task1, task2); 
} 

Я знаю, что это не решение проблемы, из-за необходимости иметь обратный вызов на doQueryAndReturnTask, но мне нужен шаблон, который работает и referrable не соединяет обратные вызовы

ответ

11

Речь идет не о Mongoose. Node.js - это асинхронный язык, поэтому он позволяет одновременно выполнять любое количество асинхронных задач (например, запросов к базе данных).

Что вам нужно, некоторые Lib для обработки асинхронного потока управления, как async.js или when.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:

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 
    }); 
}; 

Update: Обещания альтернативный способ обработки асинхронного потока управления, обернув асинхронные функции с обещаниями.

Обычно, чтобы получить результаты некоторой асинхронной функции, вы должны передать ей обратный вызов, который будет выполняться где-то в будущем.

Когда вы используете обещания, вместо того, чтобы передавать некоторый обратный вызов, вы сразу получаете обещание результатов казней, которые будут разрешены где-то в будущем.

Итак, обещания позволяют работать синхронно с асинхронными функциями, используя обещания вместо реальных данных. Обещания также позволяют дождаться результатов в любой момент выполнения.

В моем примере я выполняю два запроса, получая два обещания для их результатов. Затем я предлагаю узлу подождать, пока обе обещания не будут выполнены, передав их результаты в функцию callback.

Вы можете прочитать promises/A+ specification here. Вы также можете посмотреть when.js api docs.

+0

Можете ли вы объяснить или дать ссылку на то, что такое обещание? – Slappy

+1

@Slappy Я отредактировал свой ответ и добавил объяснение обещаний. –

Смежные вопросы