Node.js Nodejs异步函数回调错误的执行顺序

Node.js Nodejs异步函数回调错误的执行顺序,node.js,asynchronous,callback,Node.js,Asynchronous,Callback,我有一个问题,关于做几个缓慢的功能,我不知道如何得到我的价值后,每个人都完成了 我会打印一些代码给你看。 这是我的测试路线,它希望从函数GetUploadeMovies检索内容,然后这些对象中的每一个都希望从函数getMovieInfo获取更多信息,该函数将两个函数调用的结果推送到一个数组中 我的问题是这个数组只包含函数的最快运行,而不是所有对象 app.get'/test',functionreq,res{ allinfo = []; getUploadedMovies("h

我有一个问题,关于做几个缓慢的功能,我不知道如何得到我的价值后,每个人都完成了

我会打印一些代码给你看。 这是我的测试路线,它希望从函数GetUploadeMovies检索内容,然后这些对象中的每一个都希望从函数getMovieInfo获取更多信息,该函数将两个函数调用的结果推送到一个数组中

我的问题是这个数组只包含函数的最快运行,而不是所有对象

app.get'/test',functionreq,res{

allinfo = [];

        getUploadedMovies("hej", function(data){

            data.forEach(function(object){

                getMovieInfo(object.imdb_id, function(omdb){

                    omdb.forEach(function(content) {
                        allinfo.push({

                            "title" : content.title,
                            "year" : content.year,
                            "bpmvalue" : object.bpmvalue,
                        });

                    });
                    res.send(allinfo);

                });

            }); 

        });

    });
获取信息的其他功能包括:

function getUploadedMovies(user, callback){

    console.log('Getting Uploaded movies for user');

    Upload.find({user_id : "117455612749622948262"}, function(err, info){
        var allmovies = [];
        info.forEach(function(object) {
            allmovies.push(object);

        })

    callback(allmovies);
    return;

    })

}

function getMovieInfo(value, callback) {

    omdb.get( value, true, function(err, movie){

        console.log('getting info for '+movie.title);

        if(err) {
            return console.log(err);
        }

        if(!movie) {
            return console.log('No movie found');
        }

        var moviedata = [];
        globalshit = movie.imdb.id;
        moviedata.push({
                "title" : movie.title,
                "year" : movie.year,
                "plot" : movie.plot,
                "rating" : movie.imdb.rating,
                "votes" : movie.imdb.votes,
                "runtime" : movie.runtime,
                "actors" : movie.actors,
                "director" : movie.director,
                "writers" : movie.writers,
                "id" : movie.imdb.id

         });

        callback(moviedata);
        return;
    });
}
我想将allinfo发送到另一个页面以显示数据。但我只能在allinfo中获取一个对象数据

这是res.sendallinfo显示的内容:


感谢您的帮助!:

对于每个异步函数循环,您可以跟踪哪些或有多少已完成。您只需在异步函数完成时对其进行计数,并检查是否所有操作都已完成即可。如果是,则调用下一步

let done = 0
let allData = []

urls.forEach((url) => {
  $.get(url).done((data) => {
    allData.push(data)
    done++ // Increment done
    if (done === urls.length) {
      whateverComesNext(allData)
    }
  })
})

正如你自己所说,getMovieInfo是异步的。你在data.forEach的第一次迭代中调用res.sendallinfo;。你必须在对数据进行迭代后调用它。是的,但之后它就不起作用了。它甚至在方法开始之前调用它。。