Как синхронизировать асинхронный запрос MongoDB в NodeJS
Вопрос
У меня есть оператор цикла for и асинхронное тело цикла MongoDB.Я хочу сделать find
запрос из моей базы данных MongoDB и поместите результат в массив.
Вот код:
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
Но очевидно, что возвращаемым значением функции будет пустой массив.
Я хочу решить эту проблему, используя Q
модуль.Есть ли какие-нибудь решения?
Решение
Я хочу решить эту проблему с помощью модуля Q.Есть ли какие-нибудь решения?
Да, обещания — это очень простая абстракция, позволяющая справиться с этим.Вы можете выполнять запросы параллельно и собирать их результаты с помощью all
.
В частности, с Q
это будет выглядеть так:
function arrResult(…) {
var promises = [];
for (…)
promises.push( Q.ninvoke(collection, "find", {foo: i}) );
return Q.all(promises);
}
arrResult(…).then(function(arr) {
…
}, function(err) {
// first error, if any occured
});
Другие советы
Вам нужен механизм синхронизации, который действует как процесс процессов. Каждый возвратный запрос должен прибыть на ворота, напримеруменьшает какой-то счетчик и внести свой результат. Когда все прибыли на ворота, последний обратный вызов возвращает собранные результаты.