Nodejs在foreach中回调地狱

时间:2015-06-03 19:56:54

标签: json node.js express mongoose

我有一个场地数据。我想知道人们现在在这里压缩后如何将数据和数据计数到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);

2 个答案:

答案 0 :(得分:2)

_.map是同步的。为此,您需要一个异步替代方案,如async.map。另外,我不确定这真的构成了“回调地狱”。

答案 1 :(得分:2)

首先,很好地理解map函数是什么:Map采用一组输入,1对1将它们转换为不同的东西。在这种情况下,您的_venues数组为空,因为您没有在_.map回调中返回任何内容。

我一直处理这样的问题的方法是使用像bluebirdQ这样的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);
});