Счетчик возврата в обратном вызове db.collection.count() не работает, почему?

Я хочу отслеживать количество документов, которые у меня есть в коллекции на сервере node.js, используя драйвер mongodb. Я могу правильно вставлять, удалять и обновлять, но когда я пытаюсь подсчитать, он работает, пока я не попытаюсь сохранить это значение, момент, когда он ничего не возвращает.

Вот мой код:

var db_collection = db.collection('collection');

var countCollections = function () {

    var response_count_collections = null;
    db_mensajes.count(function(err,number_of_collections){
        if (err){
            console.log(err);
        } else {
            response_of_collections = number_of_collections;
            console.log('Number of collections: '+number_of_collections);
        }
    });
    return response_count_collections;
};

Он правильно регистрирует number_of_collections, но не возвращает мне правильное значение. В моем примере он возвращает null (как я определил свой var response_count_collections;), и если я попытаюсь return number_of_collections; в обратном вызове db_collections.count() следующим образом:

var db_collection = db.collection('collection');

var countCollections = function () {

    var response_count_collections = null;
    db_mensajes.count(function(err,number_of_collections){
        if (err){
            console.log(err);
        } else {
            console.log('Number of collections: '+number_of_collections);
            return number_of_collections;
        }
    });
};

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


person Rubén Marrero    schedule 11.08.2014    source источник
comment
Ваша проблема в том, что вы неправильно комбинируете синхронное и асинхронное программирование. К тому времени, когда ваша функция достигнет точки возврата, dm.messages.count может даже не выполниться.   -  person Edwin Dalorzo    schedule 11.08.2014
comment
но результат тот же, если я попытаюсь вернуть счетчик следующим образом: (отредактировано с кодом в ОП).   -  person Rubén Marrero    schedule 11.08.2014
comment
Вы не используете return в асинхронном программировании. Вместо этого вы должны использовать обратные вызовы.   -  person Edwin Dalorzo    schedule 11.08.2014


Ответы (1)


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

Если вы хотите, чтобы она была асинхронной, вам придется научиться управлять потоком программы с помощью некоторых узловых модулей, таких как async.

Обновлять:

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

person Azeem    schedule 11.08.2014
comment
Но даже если я попытаюсь вернуть значение в обратном вызове, оно зарегистрирует значение и вернет неопределенное значение. - person Rubén Marrero; 11.08.2014
comment
То, как вы возвращаете значение из обратного вызова, неверно. Взгляните на этот вопрос, он показывает, как вернуть значение из асинхронной функции с помощью обратного вызова. stackoverflow.com/questions/18950984 / - person Azeem; 11.08.2014