首页 >web前端 >js教程 >如何在 MongoDB 中处理循环内的异步数据检索?

如何在 MongoDB 中处理循环内的异步数据检索?

Patricia Arquette
Patricia Arquette原创
2024-11-09 16:59:02851浏览

How to Handle Asynchronous Data Retrieval within a Loop in MongoDB?

遇到的问题:循环内的异步数据检索

在给定的代码中,尝试在循环内从多个 MongoDB 查询检索数据并组装结果到单个数据数组中。但是,当尝试返回此数据作为响应时,会出现问题。

问题根源

问题源于 MongoDB 查询的异步特性。当执行查询时,该函数不会立即返回结果,而是启动任务并立即返回。这就是为什么用于存储聚合结果的 FinalData 以未定义形式返回:该函数在查询完成并收集数据之前退出。

解决方案:拥抱 Promises

要解决此问题,我们需要利用 Promise,它通过提供处理异步任务流的结构化方法来促进异步编程。 Promise 允许我们定义一个在异步任务完成时执行的函数。

实现 Promise

实现 Promise:

  1. 识别异步函数: 确定代码中的哪些函数是异步的,因为它们需要包装在 Promise 中。在这种情况下,forEach 回调和 Prayer.find 是异步的。
  2. 包装异步函数: 对于本身不返回 Promise 的函数,创建返回 Promise 的包装器。在本例中,我们使用 Q.nbind 将 Prayer.find 包装在一个承诺返回函数中。
  3. 链式回调函数: 使用 .then 来链式回调函数,当承诺已解决。在回调函数中,执行任何必要的操作并返回结果。

最终解决方案

考虑到这些概念,修改后的 getPrayerInCat 函数如下:

function getPrayerInCat(data) {
    var promises = data.map(function(data2) {
        var id = data2.id;
        return find({ prayerCat: id })
            .then(function(prayer) {
                if (!prayer)
                    data2.prayersCount = 0;
                else
                    data2.prayersCount = prayer.length;
                return data2;
            });
    });
    return Q.all(promises);
}

以上是如何在 MongoDB 中处理循环内的异步数据检索?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn