2
var models = require('../models')
  , _ = require('underscore')
  , Restaurant = models.restaurant
  , RestaurantBranch = models.restaurant_branch;


module.exports = {
  index: function (req, res) {
    var title = 'Restaurants near you';

    RestaurantBranch.find({country: 'Ghana', region: 'Greater Accra'}, function (err, branches) {


      var results = _.map(branches, function (branch) {
        Restaurant.findById(branch._restaurantId, function (err, restaurant) {
          return {
            'restaurant': restaurant,
            'branch': branch
          };
        });
      });

      res.send(results);
    });

  }
};

我无法让 _.map 按我想要的方式工作。而不是得到一个带有 objects 的新数组{restaurant: restaurant, branch: branch}。我得到[null, null]了。

我尝试了 lodash 而不是下划线,我得到了相同的行为。

4

2 回答 2

8

问题是你的Restaurant.findById线。该函数似乎是异步的;_.map是同步的。

因此,当您返回数据时,为时已晚。的迭代_.map可能已经完成。

对于您想要的异步内容,也许您应该考虑使用async ( async.map ),

使用异步的示例:

async.map(branches, function (branch, callback) {
  Restaurant.findById(branch._restaurantId, function (err, restaurant) {
    callback(null, { restaurant: restaurant, branch: branch });
  });
}, function (err, results) {
    res.send(results);
});
于 2013-09-17T06:36:13.000 回答
0

我找到了解决问题的另一种方法。因为无论如何我都在使用猫鼬,所以我可以轻松地使用人口来获取餐厅数据,而不是使用下划线/lodash。

var models = require('../models')
  , Restaurant = models.restaurant
  , RestaurantBranch = models.restaurant_branch;


module.exports = {
  index: function (req, res) {
    var title = 'Restaurants near you';

    RestaurantBranch.find({country: 'Ghana', region: 'Greater Accra'})
      .populate('_restaurantId')
      .exec(function (err, branches) {
        res.send(branches);
      });

  }
};
于 2013-09-17T06:57:01.003 回答