Как синхронизировать асинхронный запрос MongoDB в NodeJS

StackOverflow https://stackoverflow.com//questions/22023146

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть оператор цикла 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
});

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top