Mongodb中的异步,承诺和闭包

时间:2018-04-08 18:24:17

标签: javascript node.js mongoose

我是Javascript的新手,我正在努力绕过Javascript中的异步函数和承诺。我正在使用猫鼬并试图发送一个结果对象。这就是我到目前为止所做的:

x = [12, 37, 64, 159, 205, 225, 239, 252, 257]
a = [(12,37),(37,64),(64,159),(159,205),(205,225),(225,239),(239,252),(252,257)]

以下是我不明白的事情:

  1. 控制台打印完成一个循环'打印前两次'分配项目'。我相信这与promises和异步属性有关。
  2. 我无法在我的评级功能中访问本地变量结果。我认为这与封闭有关,但我不确定。
  3. 我希望能够从聚合函数中的项目中分配属性,然后将新结果作为响应发送。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

我通过将整个函数拆分为多个异步函数来重新编写整个函数。这将在执行下一行之前等待查询完成。

idiomController.search = async(req, res, next) => {
    var results = await findIdiom(req.query.keyword);
    var temp = [];
    for(var i = 0; i < results.length; i++) {
        var agg = await aggregateResults(results[i]);
        temp.push({
            rating: agg[0].rating,
            total: agg[0].total
        });
    }
    //handle response
}

aggregateResults = (result) => {
    return Rating.aggregate(
        [
            {
                "$match": {
                    "idiomid": { "$eq": result._id }
                }
            },
            {
                $group: {
                    _id: {idiomid: "$idiomid", type: "$type"},
                    rating: { $sum: "$rating"},
                    total: { $sum: 1}
                }
            }
        ]
    );
}

findIdiom = (keyword) => {
    return Idiom.find({keywords: keyword});
}