2015-06-03 121 views
0

我有一個場館數據。我想知道現在的人們在壓縮場地數據和計數數據到json之後的情況。此代碼正在工作,但json結果爲空。Nodejs回調地獄在foreach

var _venues = _.map(venues.response.venues, function (v) { 
    Checkin.where({ 
      'venuesUniqeId': v.Id, 
      'createdDate': { 
       $gte: new Date().getHours() - 2 
      } 
     }) 
     .count(function (err, hereNow) { 

      return new Venue({ 
       'uniqeId': v.id, 
       'name': v.name, 
       'count': hereNow 
      }); 
     }); 
}); 
return r.json(_venues); 
+0

如果我不派例如貓鼬查詢中刪除Checkin.where()......只返回值是工作,但我需要數 – user3036749

+0

是Checkin.where異步函數? – tmcgoo

+0

Checkin.where是貓鼬查詢http://mongoosejs.com/docs/queries.html – user3036749

回答

2

首先,很好地理解map函數是什麼:Map接受一組輸入並且1對1將它們轉換成不同的東西。在這種情況下,您的_venues數組爲空,因爲您沒有在_.map回調中返回任何內容。

我一直在處理這樣的問題的方式是使用承諾庫,如bluebirdQ,並利用.all方法。在這種情況下,您的_.map不會輸出實際的_venues,而是_venuePromises,您稍後執行並等待一系列場所。換句話說,由於貓鼬的異步性質,Checkin.where的輸出不是場館的集合,而是一組承諾。

免責聲明:我不使用貓鼬,所以我不確定它是如何與Q或Bluebird集成的。

var Promise = require('bluebird'); 

var _venuePromises = _.map(venues.response.venues, function (v) { 
    return Checkin.where({ 
      'venuesUniqeId': v.Id, 
      'createdDate': { 
       $gte: new Date().getHours() - 2 
      } 
     }) 
     .count(function (err, hereNow) { 

      return new Venue({ 
       'uniqeId': v.id, 
       'name': v.name, 
       'count': hereNow 
      }); 
     }); 
}); 

Promise.all(_venuePromises).then(function (actualVenues) { 
    return r.json(actualVenues); 
}); 
+0

你是偉大的英雄人:) – user3036749

2

_.map是同步的。爲此,您需要一個異步備選方案,如async.map。另外,我不確定這是否構成「回撥地獄」。

+0

我嘗試async.map,但我無法解決這個問題。我需要結合場館數據和統計數據 – user3036749