2014-12-05 2 views
0

나는 node.js, mongoose 및 foursquare API를 사용하고 있습니다.자바 스크립트 변수 범위 몽구스 쿼리

  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

+0

@ Ren4n 예제를 업데이트했습니다. 다음은 비동기 쿼리가 완료되었을 때 한 번 호출되는 콜백 함수입니다. next (err) -이 코드는 비동기 쿼리가 오류를 반환하면 마지막 콜백에서 오류 메시지가 표시됨을 의미합니다. 다음 (null) - 검색어가 완료되면 배열의 다음 항목으로 이동해야합니다. http://goo.gl/ed865p –

관련 문제