当前位置: 首页 > 面试题库 >

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

江宏伟
2023-03-14
问题内容

我在循环中进行了多个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返回未定义。


问题答案:

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

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

您要使用哪些功能?是getPrayerInCatforEach回调和Prayer.find

嗯,Prayer.find不返回promise,它是一个库函数,因此我们无法对其进行修改。规则2起作用:

为每个不创建的函数创建一个立即包装

在我们的情况下,使用[Q的节点接口助手]很容易:

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

现在,我们只有承诺,而不再需要任何延期。第三条规则起作用:

所有与异步结果有关的事情都会进入.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()将为我们带来多个承诺,其异步任务并行运行并以未知顺序解析。我们希望等待所有这些,例如,当每个任务完成时,获得可以解决所有结果的承诺。

对于此类复杂的任务,请勿尝试提出自己的解决方案:

检查您库的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。



 类似资料:
  • 我刚刚开始学习平均堆栈,我被卡住了。我需要将下面的查询数据发送到前端。 我试过这样做,但没有成功

  • 我目前正在做一个优惠券项目。在处理我的facade类时,我遇到一个问题,通过使用外键从表中输入客户的ID来获取客户已购买的优惠券列表。 我使用的方法是: 优惠券类别: 调用方法: 我的SQL表: Coupon_vs_Customer表仅包含2行。它们都是其他表的外键。CustomerID连接到“Customers”表,而coupon_ID连接到表“Coupons” 正如您在上面看到的,ID为1的客

  • 我正在为Discord制作一个机器人,这个机器人的一个功能是一个级别系统。我决定从使用JSON存储数据转向使用sqlite。我正在node.js中使用sqlite3,并试图创建一个函数来创建/检索播放器的数据。我的目标是让这个函数返回查询中的数据,但我正在努力找出我做错了什么。我已经读到,我需要使用发送到查询函数的回调,但这对我来说也不起作用(对于这个函数的目标也不起作用)。 因此,任何关于如何创

  • 我正在两个标记之间画一条路线,我想保存那条路线。为此,我将包含lat和lng的ArrayList保存在Firebase数据库中。但我在取回航路点时遇到了问题。我是这样插入的: 在检索数据时,我尝试执行以下操作:

  • 我正在尝试使用从axios调用中检索到的数据。我在响应中得到了正确的信息,但当我试图返回响应时,调用函数中没有定义。是否有不同的方法将response.data返回给调用函数?

  • 问题内容: 我正在使用JDBC,需要不断检查数据库是否有更改值。 我目前拥有的是无限循环运行,内部循环迭代更改的值以及针对数据库的每次迭代。 我认为这不是最好的方法。 我在想的另一种方法是反向操作,以保持对数据库的迭代。 更新 感谢您提供有关计时器的反馈,但我认为它不能解决我的问题。一旦数据库中发生更改,我需要立即针对更改的值(示例代码中的“ el”)处理结果。 即使数据库没有更改,它仍然必须不断