gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:08:34 25 4
gpt4 key购买 nike

我在循环中进行了多个 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 的一般规则开始:

Every function that does something asynchronous must return a promise

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

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

Create an immediate wrapper for every function that doesn't

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

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

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

Everything that does something with an async result goes into a .then callback

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

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,它们的异步任务并行运行并以未知的顺序解析。我们希望等待所有这些 - 即,当每个任务完成时,得到一个解决所有结果的 promise 。

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

Check the API of your library

我们在那里找到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。

关于javascript - 返回从循环中调用的数据库查询中检索到的数据的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com