Обратные вызовы с помощью node.js / MongoDB / Mongoose - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь изучить Mongoose ORM для MongoDB и node.js.Я хочу запросить документы в моей базе данных, выполнить действие для каждого из них, а затем выполнить другое действие после завершения всех предыдущих действий.Другими словами, я хочу сделать что-то вроде этого, предполагая, что у меня есть модель с именем 'User:'

var userArray = [];
User.find({})
.each(function(user) {
    user.age += 1;
    userArray.push(user);
})
.then(function() {
    //do something with userArray
    //happens after all the users' ages are modified
});

Каков правильный синтаксис для того, чтобы сделать что-то подобное в Mongoose?

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Если вам нужно выполнять синхронные действия только для каждого документа, решение довольно простое. (console.warn () является синхронным, поэтому вы можете использовать его для проверки того, что все пользовательские объекты обрабатываются первыми.)

User.find({}).execFind(function(err, users) {
     users.forEach(function(user) {
          user.age += 1;
          userArray.push(user);
          console.warn('x');
     });
     // then...
     console.warn('y');
});

Если вам нужно выполнить какое-то асинхронное действие (возможно, другой запрос БД), решение становится более сложным. Я недавно столкнулся с этой проблемой и кратко обсудил ее с помощью такого модуля, как Step, или развертывание своего собственного базового решения. Step предоставил больше функциональности, чем мне было нужно, поэтому я решил, что дополнительные накладные расходы не стоят того. Вот мое решение:

    var count = 0;
A.find({ b : c }, ['d', 'e', 'f']).sort(['d'], -1).execFind(function(err, g) {
    g.forEach(function(h) {
        h.a = [];
        B.find({ b : c }, ['d', 'e', 'f', 'g']).execFind(function(err, z) {
            g.v = z;
            if (++count == g.length)
                res.render('z.jade', { locals : { title : 'Q', j : g } });
        });
    });
});

Прошу прощения за запутывание (я вырвал это прямо из источника проекта, который скрыт). По сути, вы ждете завершения последней асинхронной операции.

1 голос
/ 06 сентября 2012

Для этого есть модули.Попробуйте использовать async (https://github.com/caolan/async). Он позволяет запускать команды и затем выполнять обратный вызов, как только все будет сделано.

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...