Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB多个异步查询返回无序结果_Node.js_Mongodb_Asynchronous - Fatal编程技术网

Node.js MongoDB多个异步查询返回无序结果

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

我有一系列的课程[课程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"
}, {
    "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;
异步的(
函数(){
返回计数器