2014-12-05 41 views
0

我正在使用node.js,mongoose和foursquare API。當貓鼬查詢時Javascript可變範圍

  foursquare.getVenues(params, function(err, venues) { 
      if(err) return res.json(JSON.stringify({status: 'error', returnData: err})); 

      // variable initialization 
      var rooms = []; 
      var vanueItem; 

      // iterate foursquare return list (venue item) 
      venues.response.venues.forEach(function(item) { 
       Room.aggregate(
        [ 
        { "$group": { 
          "_id": '$mobileUser.genderType', 
          "genderTypeCount": { "$sum": 1 } 
         }} 
        ], 
        function(err,result) { 
        if(err) return res.json(JSON.stringify({status: 'error', returnData: err})); 

        // build it to return after 
        vanueItem = 
         { 
          id: item.id, 
          name: item.name, 
          description: item.description, 
          contact: item.contact.formattedPhone, 
          lat: item.location.lat, 
          lng: item.location.lng, 
          distance: item.location.distance, 
          city: item.location.city 
         }; 

         // insert it into venue array 
         rooms.push(vanueItem); 
        } 
       ); 
      }); 

      return res.json(JSON.stringify({ status: 'success', returnData: rooms })); 
     }); 

我遇到了房間數組的問題。當我刪除'Room.aggregate'查詢時,工作正常(所有房間都可以),但是當我使用聚合時,返回功能給了我空房間。

我已經嘗試從'var rooms = [];'中刪除var

回答

1

Room.aggregate是異步的功能,如果你想遍歷異步函數可以使用異步庫,這樣

var async = require('async'); 

foursquare.getVenues(params, function(err, venues) { 

    if (err) return res.json(JSON.stringify({ 
     status: 'error', 
     returnData: err 
    })); 

    var rooms = []; 
    var vanueItem; 

    async.each(venues.response.venues, function (item, next) { 
     Room.aggregate(
      [{ 
       "$group": { 
        "_id": '$mobileUser.genderType', 
        "genderTypeCount": { 
         "$sum": 1 
        } 
       } 
      }], 
      function(err, result) { 
       if (err) { 
        return next(err); 
       } 

       // build it to return after 
       vanueItem = { 
        id: item.id, 
        name: item.name, 
        description: item.description, 
        contact: item.contact.formattedPhone, 
        lat: item.location.lat, 
        lng: item.location.lng, 
        distance: item.location.distance, 
        city: item.location.city 
       }; 

       rooms.push(vanueItem); 

       next(null); 
      } 
     ); 

    }, function (err) { 
     if (err) { 
      return res.json(JSON.stringify({ 
       status: 'error', 
       returnData: err 
      })); 
     }   

     return res.json(JSON.stringify({ 
      status: 'success', 
      returnData: rooms 
     })); 
    }); 
}); 
+0

謝謝你,它工作得很好!但我有一個問題......爲什麼我需要編寫「下一個(錯誤)」? – Ren4n 2014-12-05 20:46:57

+0

@ Ren4n我更新了示例..,next是在異步查詢完成時調用一次的回調函數,next(err) - 此代碼表示如果異步查詢返回錯誤,則在上次回調中,我們會收到錯誤消息。 next(null) - 查詢完成時需要進入數組中的下一個項目... http://goo.gl/ed865p – 2014-12-05 20:57:35