Node.js MongoDB多个异步查询返回无序结果
我有一系列的课程[课程1,课程2,…,课程2]。每个课程都有一个英雄UUID,它与另一个集合中对象的UUID相匹配Node.js MongoDB多个异步查询返回无序结果,node.js,mongodb,asynchronous,Node.js,Mongodb,Asynchronous,我有一系列的课程[课程1,课程2,…,课程2]。每个课程都有一个英雄UUID,它与另一个集合中对象的UUID相匹配 // This is actually another db query but imagine it's an array var courses = [{ "courseName": "Sample course name 1", "hero": "a3f6f088-7b04-45e8-8d3b-d50c2d5b3a2d" }, { "courseNa
// This is actually another db query but imagine it's an array
var courses = [{
"courseName": "Sample course name 1",
"hero": "a3f6f088-7b04-45e8-8d3b-d50c2d5b3a2d"
}, {
"courseName": "Sample course name 2",
"hero": "1b46227a-c496-43d2-be8e-1b0fa07cc94e"
}, {
"courseName": "Sample course name 3",
"hero": "c3bae6bf-2553-473a-9f30-f5c58c4fd608"
}];
我需要迭代所有课程,获取英雄uuid并对英雄集合进行查询,然后在查询完成后将英雄信息添加到课程对象
问题在于,所有查询都被快速触发,以至于MongoDB以任意顺序返回它们。它按顺序接收所有3个hero UUID,但有时会在第一个UUID之前返回第三个UUID,等等。是否有一种方法可以让一个查询完成,然后再执行另一个查询,等等
我现在正在做的是:
var newCourses = courses;
var counter = 0;
courses.forEach(function (course) {
var courseHeroUuid = course.hero;
// This function does the query by uuid and returns the doc
getHeroByUuid(courseHeroUuid, function (err, result) {
if (err) {
next(err);
}
// Replace the hero UUID with the hero document itself
newCourses[counter].hero = result[0];
if (++counter == courses.length) {
next(null, newCourses);
}
}
});
这是async.瀑布数组中的一个函数,这就是我跟踪计数器并调用next()继续的原因。我知道我可以使用async。在每次迭代中,我都尝试了它,但没有帮助。
这就是我正在做的问题
function getHeroByUuid(heroUuid, callback) {
Hero.find({uuid: heroUuid}, function (err, result) {
if (err) {
callback(err);
}
callback(null, result);
})
}
发生这种情况:
很抱歉回答我自己的问题,但我已经解决了。我需要的东西就在我眼前 最后,我使用了
async.while()
函数,文档正是我所需要的,并且做的正是我所需要的——在返回上一个循环的结果后执行循环的下一个迭代
我的代码现在如下所示:
var newCourses = courses;
var courseItemsLength = courses.length;
var counter = 0;
async.whilst(
function () {
return counter < courseItemsLength;
}, function (callback) {
var heroUuid = allCourses[counter].hero;
getHeroByUuid(heroUuid, function (err, result) {
if (err) {
next(err);
}
newCourses[counter].hero = result.name;
counter++;
if (err) {
callback(err);
}
callback();
});
}, function (err) {
if (err) {
next(err);
}
next(null, newCourses);
});
var newCourses=课程;
var courseItemsLength=courses.length;
var计数器=0;
异步的(
函数(){
返回计数器