Запрос и обработка асинхронных узлов. - PullRequest
3 голосов
/ 27 апреля 2011

У меня есть массив объектов, взятых из mongodb. Каждый элемент в массиве является постом, автором которого является user_id. Теперь я хочу найти информацию о пользователе, связанную с user_id.

Поскольку узел использует асинхронные методы для поиска данных из базы данных, цикл forEach завершается до завершения обратных вызовов.

docs.forEach(function(doc, index){
        //get the user for this doc
        User.find({_id: mongo.BSONPure.ObjectID(doc.user_id)}, {name: 1, username: 1, email: 1}).skip(0).limit(1).toArray(function(err, user){
            user = user[0]
            if(err) {
                throw new Error(err)
            } else {
                docs[index].user = user
                if(doc.for_id) {
                    User.find({_id: mongo.BSONPure.ObjectID(doc.for_id)}, {name: 1, username: 1, email: 1}).skip(0).limit(1).toArray(function(err, for_user){
                        for_user = for_user[0]
                        if(err) {
                            throw new Error(err)
                        } else {
                            docs[index].for_user = for_user
                        }
                    })
                }
            }
        })
    })

Таким образом, в конце этого цикла, если я отправляю cb (документы), документы не имеют атрибута user и for_user. Как мне это преодолеть?

1 Ответ

2 голосов
/ 27 апреля 2011

Использовать Шаг для node.js .Он будет выполнять ваши функции в последовательном порядке

var Step = require('step');

Step(  docs.forEach(...), function() { cb(docs); } );

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

var count = docs.count(); // or something
var processed = 0;
docs.forEach(... if (++processed == count) cb(docs); );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...