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

この問題を回避する別の方法を見つけました。とにかくマングースを使用しているので、アンダースコア/ロダッシュを使用する代わりに、人口を使用してレストランのデータを簡単に取得できます。

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 に答える