我有一个场地数据。我想知道人们现在在这里压缩后如何将数据和数据计数到json。此代码正常,但json结果为null。
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 :(得分:2)
_.map
是同步的。为此,您需要一个异步替代方案,如async.map
。另外,我不确定这真的构成了“回调地狱”。
答案 1 :(得分:2)
首先,很好地理解map
函数是什么:Map采用一组输入,1对1将它们转换为不同的东西。在这种情况下,您的_venues
数组为空,因为您没有在_.map
回调中返回任何内容。
我一直处理这样的问题的方法是使用像bluebird
或Q
这样的promises库并利用.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);
});