【问题标题】:Nodejs callback hell in foreachforeach 中的 Nodejs 回调地狱
【发布时间】:2015-08-18 05:11:45
【问题描述】:

我有一个场地数据。我想知道现在这里的人们如何压缩场地数据并将数据计数到 json。此代码正在运行,但 json 结果为空。

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);

【问题讨论】:

  • 如果我不发送 mongoose 查询,例如删除 Checkin.where()... 只返回值它是工作但我需要计数
  • Checkin.where 是异步函数吗?
  • Checkin.where 是 mongoosejs.com/docs/queries.html 的猫鼬查询

标签: json node.js express mongoose


【解决方案1】:

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

【讨论】:

  • 我尝试了 async.map 但我无法解决这个问题。我需要结合场地数据和计数数据
【解决方案2】:

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

我一直解决此类问题的方法是使用诸如bluebirdQ 之类的promise 库并利用.all 方法。在这种情况下,您的 _.map 不会输出实际的_venues,而是输出_venuePromises,您稍后会执行并等待一系列场地。换句话说,由于 mongoose 的异步特性,Checkin.where 的输出不是场所的集合,而是承诺的集合。

免责声明:我不使用 mongoose,所以我不确定它如何与 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);
});

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多