Node.js - mongoose promises - 循环遍历

时间:2018-01-06 17:08:07

标签: javascript node.js mongodb mongoose

我遇到了与node.js一起使用的mongoose的问题。在我的模型中,我只有组主管的ID,并且在此路由中我还想将supervisorName添加到变量(此名称存储在组模型中)。所以,是的,我已经阅读了一些关于承诺的内容,但是,我仍然不知道如何解决这个问题。 (基本上,我只想循环遍历所有组,从mongodb获取模型,并为每个组分配主管名称)

router.get('/manage', function(req, res, next) {
Group.find({}, function(err, groups) {
    groups.forEach(function(group) {
        Group.findById(group.supervisor, function(err, supervisor) {
            group.supervisorName = supervisor.name;
            console.log(supervisor.name);
        });
    });
}).then(function() {
    res.render('groups/groups_manage', {groups : groups});
});
});

1 个答案:

答案 0 :(得分:0)

您可以{group 1}将您的群组数组转换为map数组并使用promises解决所有问题。

Promise.all

说明:

  1. Mongoose Model方法支持回调和promises接口。但是,要使用promise接口,我们需要使用router.get('/manage', function(req, res, next) { Group.find({}) .exec() // 1 .then(groups => { return Promise.all(groups.map(group => { // 2, 3 return Group.findById(group.supervisor) .exec() .then((supervisor) => { // 4 group.supervisorName = supervisor.name; return group; }); })); }) .then(propGroups => { res.render('groups/groups_manage', {groups : popGroups}); }); }); 方法并删除回调。
  2. exec接受一系列承诺。它等待所有人解决,他们中的任何一个拒绝(给出错误)。 注意:承诺是并行执行的
  3. 我们有一组Promise.all个对象,我们将它们映射到promises中。致电group并再次使用.findById来获取承诺。 注意:请记住回复您的承诺
  4. 我们更新对象,并将其作为promise的最终结果返回。