返回从循环中调用的数据库查询中检索到的数据的问题

     2023-02-16     243

关键词:

【中文标题】返回从循环中调用的数据库查询中检索到的数据的问题【英文标题】:Issue in returning data retrieved from DB queries called in the loop 【发布时间】:2014-11-03 07:03:15 【问题描述】:

我在循环中进行了多个 mongoDB 查询。并希望将所有结果作为一个数据数组发送。但是当我简单地使用 return 发送数据时,它只是返回 undefined 并且不等待所有 DB 请求的结果。我也尝试使用 q.moulde 但同样的问题。

代码:

var getPrayerInCat = function(data)
    var result ;
    var finalData = [];
    if(data.length >0)
             data.forEach(function(data2)
                 var id= data2.id;
                 Prayer.find(prayerCat:id,function(err,prayer)
                     var deferred = Q.defer()
                     if (err)  // ...
                         console.log('An error has occurred');
                         // res.send(err);
                         result= finalData = err
                      else 
                         if(!prayer)
                             // console.log(data2.id+'--0');
                             data2.prayersCount = 0;
                             result = deferred.resolve(finalData.push(data2))
                          else 
                             // console.log(data2.id+'--'+prayer.length);
                             data2.prayersCount = prayer.length;
                             // console.log(prayer)
                             result =  deferred.resolve(finalData.push(data2))
                          // else for data forward
                     
                     deferred.promise;
                 )
                // deferred.resolve(finalData);

             )
             /*if(finalData.length > 0)  return finalData;*/
        

finalData 返回未定义。

【问题讨论】:

这是一个承诺。我可以删除它,我正在尝试解决问题所以我尝试了这个东西 您的函数getPrayerInCat() 不返回任何内容或将任何内容返回给回调。如果您从代码中删除 cmets 并更新您的帖子以包含您的例外输出应该是什么,这也会很有帮助。你应该返回deferred.promise;,而不是仅仅显示它? 我认为 finalData 是未定义的,因为它是在从您的延迟对象填充之前被访问的。 @MuddassirKhanani: 公平,Q 没有moulde 方法。你的意思是?您在代码中的什么地方使用了它? 【参考方案1】:

让我们从使用 Promise 的一般规则开始:

每个执行异步操作的函数都必须返回一个承诺

在您的情况下,这些功能是什么?这是getPrayerInCatforEach 回调和Prayer.find

嗯,Prayer.find 不返回承诺,它是一个库函数,所以我们不能修改它。规则 2 发挥作用:

Create an immediate wrapper 对于每个不支持的函数

在我们的例子中,Q's node-interfacing helpers 很容易:

var find = Q.nbind(Prayer.find, Prayer);

现在我们只有 Promise,不再需要任何 deferred。第三条规则发挥作用:

所有对异步结果执行操作的操作都会进入 .then 回调

...并返回结果。地狱,如果“某事”是异步的,那么这个结果甚至可以是一个承诺!这样,我们就可以编写完整的回调函数了:

function getPrayerCount(data2) 
    var id = data2.id;
    return find(prayerCat:id)
//  ^^^^^^ Rule 1
    .then(function(prayer) 
//  ^^^^^ Rule 3
        if (!prayer)
            data2.prayersCount = 0;
        else
            data2.prayersCount = prayer.length;
        return data2;
//      ^^^^^^ Rule 3b
    );

现在,我们有一些更复杂的东西:一个循环。反复调用getPrayerCount() 会得到多个promise,它们的异步任务并行运行并以未知顺序解决。我们希望等待所有这些 - 即,当每个任务完成时,得到一个解决所有结果的承诺。

对于如此复杂的任务,不要试图想出自己的解决方案:

检查库的 API

我们在那里找到了Q.all,它正是这样做的。现在写getPrayerInCat 轻而易举:

function getPrayerInCat(data) 
    var promises = data.map(getPrayerCount); // don't use forEach, we get something back
    return Q.all(promises);
//  ^^^^^^ Rule 1

如果我们需要对 Q.all 解析为的数组做任何事情,只需应用规则 3。

【讨论】:

我已经使用了您的代码,但同样的问题它返回表单 find 并且不要等待来自 db 的结果。所以最终的结果是不确定的。 getPrayerCat('').then(function(data) getPrayerInCat(data) ).then(function(data2) console.log(data2) ) var getPrayerInCat = function(data) 变量结果 ; var finalData = []; if(data.length >0) var promises = data.map(getPrayerCount);返回 Q.all(promises); 函数 getPrayerCount(data2) var id = data2.id; return find(prayerCat:id) .then(function(prayer) if (!prayer) data2.prayersCount = 0; else data2.prayersCount = gray.length; return data2; ); 您在 then 回调中忘记了规则 1。它需要是getPrayerCat('').then(function(data) return getPrayerInCat(data); ).then(…)。不返回任何内容,promise 解析为 undefined... 这次我又遇到了同样的问题,又添加了一个循环@Bergi

显示从 http 调用 Angular 检索到的更新数据

...对象中。我在浏览该方法时看到了这一点,并看到我的for循环成功地将项目添加到已经存在的数组中。正在添加“O 查看详情

从数据库中检索到的实体与查询中的情况相同

】从数据库中检索到的实体与查询中的情况相同【英文标题】:Entityretrievedfromdatabasewithsamecaseasinquery【发布时间】:2017-10-2506:08:23【问题描述】:我的数据库包含下表:表:countrycodevarchar(255)notnullprimarykey;类:@EntitypublicclassCountry... 查看详情

将使用 Python 从 Twitter 检索到的数据保存到文本文件中?

...定推文,并希望将结果保存到文本文件中,但我的代码只返回返回的推文的最后 查看详情

如何从flutter中从异步任务中检索到的数据中将图像加载到卡片中?

...图像加载到卡中。我有一个异步任务,它返回从sqlite本地数据库中查询的Future>用户数据。 查看详情

如何翻转/重组从 SQL 选择语句中检索到的数据?

...:08【问题描述】:现在,我有一个SQL查询,它以下列方式返回数据:“SCHOOL”和“TEACHER”列中都有重复值,例如学校A和学校C都有老师叫史密斯女士。我需要以这种方式呈现我的数据:是否可以直接在SQLs 查看详情

从数据库中检索到的文档的 BSON 对象大小

】从数据库中检索到的文档的BSON对象大小【英文标题】:BSONobjectsizeofdocumentretrievedfromDB【发布时间】:2016-11-2309:38:51【问题描述】:Mongoshell有thebsonsize()method来获取从DB中检索到的给定文档的BSON大小。有没有办法使用PyMongo驱动... 查看详情

ExtJs 处理异步调用

...。在其中一个网格面板中,顶部有一个操作菜单。根据从数据库中检索到的值,我需要显示或隐藏菜单。为此,我可以使用菜单的hidden属性。问题是我用来从数据库中检索值的函数异步运行并且需要时间来检索值并且在它返回时... 查看详情

遍历 for 循环并将检索到的数据保存在每个循环的唯一 csv 文件中 | Python

】遍历for循环并将检索到的数据保存在每个循环的唯一csv文件中|Python【英文标题】:Iteratingthroughaforloopandsavingtheretrieveddatainauniquecsvfileforeachloop|Python【发布时间】:2021-10-0621:24:32【问题描述】:我是python新手,我正在尝试使用for... 查看详情

NSMutableArray 不保存从数据库中检索到的对象(核心数据)

】NSMutableArray不保存从数据库中检索到的对象(核心数据)【英文标题】:NSMutableArraydoesnotsaveobjectsretrievedfromthedatabase(coredata)【发布时间】:2013-05-1720:37:44【问题描述】:我有一个非常奇怪的问题,它快把我逼疯了。senario是一个... 查看详情

为啥从 json 操作中检索到的数据显示为未定义?

...的结构是对的吗?我认为错误在其中之一。我正在尝试从数据库中获取所需的数据,我在loadData()函数中使用consol 查看详情

Android:从数据库中检索位图的问题

】Android:从数据库中检索位图的问题【英文标题】:Android:problemretrievingbitmapfromdatabase【发布时间】:2011-01-1623:39:21【问题描述】:当我从sqlite数据库中检索图像时,我的位图对象bm返回null值,谁能帮帮我..?我在我的数据库中... 查看详情

由于属性不同,从 api 调用中检索数据时出错

...】:2021-11-1217:56:14【问题描述】:您好,我正在使用一个返回如下的api"secret-finance":"usd":0.04883396问题是我正在使用vue并检索这样的数据asyncgetCurrentSefiPrice()awaitaxios. 查看详情

在 Firebase 中,检索到的数据不会从 .observeEventType 方法中取出

...我在项目中定义了一个类,用于管理我在Firebase中设置的数据库。以下是到目前为止我对课程所做的工作。importFoundationim 查看详情

JS 代码不适用于从 Django 模型中检索到的所有数据

】JS代码不适用于从Django模型中检索到的所有数据【英文标题】:JScodenotworkingonalldataretrievedfromDjangoModel【发布时间】:2020-03-2208:51:23【问题描述】:我正在使用HTML页面上的forloop从Django模型中检索endDate字段。我想检查所有即将到... 查看详情

如何连接从数据库中检索到的值[关闭]

】如何连接从数据库中检索到的值[关闭]【英文标题】:Howtoconcatvalueswhichretrievedfromdatabase[closed]【发布时间】:2013-07-2211:39:20【问题描述】:我正在SQLServer2008中执行此查询SELECT(CONVERT(DATE,GETDATE()))它会显示结果2013-07-22。我需要将... 查看详情

循环遍历数据库 ResultSet

】循环遍历数据库ResultSet【英文标题】:LoopingthroughdatabaseResultSet【发布时间】:2013-11-0913:23:01【问题描述】:我在这里有一个Java代码的sn-p,它应该从数据库查询中检索结果,并且ResultSet应该遍历这些值,以便为ResultSet的每个条... 查看详情

对从数据库中检索到的数据进行分页后,模式窗口不会打开

】对从数据库中检索到的数据进行分页后,模式窗口不会打开【英文标题】:Modalwindowwillnotopenafterpaginatingretrieveddatafromthedatabase【发布时间】:2020-03-0419:44:23【问题描述】:我使用Bootstrap框架、php、SQL和jQuery构建了一个图像库,... 查看详情

从存储过程中检索数据

...试从存储过程中获取我的所有信息,该存储过程将单个列返回到数据表中。我在这里遵循了大多数解决方案,但似乎无法弄清楚为什么它不起作用。我的数据表有一个主键约束,因为它有多个值。但是,根据我的阅读,这不是必... 查看详情