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

时间:2014-12-11 17:39:10

标签: node.js asynchronous callback

关于做几个“慢功能”我有一个问题,我不知道如何在完成所有这些功能后获得我的价值。

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

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

app.get('/ test',function(req,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.send(allinfo)显示的内容: enter image description here

感谢所有人的帮助! :)

1 个答案:

答案 0 :(得分:0)

对于每个异步函数循环,您可以跟踪已完成的(或多少个)。您可以通过简单地计算完成后的异步函数,并检查是否所有内容都已完成来实现。如果是,则调用下一步。

let done = 0
let allData = []

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