Javascript 从多个回调返回值

Javascript return value from multiple callback

本文关键字:回调 返回值 Javascript      更新时间:2023-09-26

我想等待所有回调函数完成,然后返回最终结果,如下所示:

                    var jsonArray = new Array();
                    for(var i = 0; i < 10; i++)
                    {
                        jQueryFunction(i, function(json){
                            jsonArray[i] = json;
                        });
                    }
                    return jsonArray;

jQueryFunction是一个包含异步ajax和回调的函数,返回一个称为json的值。我想等待 for 循环完成,然后将所有返回值放入 jsonArray,最后返回它。

我的目标是等待所有jQueryFunction回调完成并将其返回存储到jsonArray中,然后在最后返回jsonArray。我之前的目标不起作用,因为它立即返回 jsonArray 并且不等待 for 循环

我试过这样:

                function jQueryFunction(ptd_url, callback)
                { 
                    $.ajax
                            ({
                                type: "GET",
                                async: true,
                                url: ptd_url,
                                dataType: "jsonp",
                                jsonp: "callback",
                                jsonpCallback: "tpsHandler",
                                success: function(json)
                                {
                                    return callback(json);
                                }
                            });  
                }
                function finalResultFunction()
                {
                    var jsonArray = new Array();
                    for(var i = 0; i < 10; i++)
                    {
                        jQueryFunction(1, function(json){
                            jsonArray[i] = json;
                            alert(jsonArray[i]);
                        });
                    }
                    $.when.apply($, jsonArray).done(function(){
                      alert(jsonArray[0]);
                    ...
                 }
                 setInterval(finalResultFunction,1000);

第一个警报向我显示正确的对象,但第二个警报仍然显示 null。为什么?如何解决?

你可以使用 jquery 的when来等待多个请求。 您只需要jQueryFunction即可返回jqXHR

function jQueryFunction(){
    return $.ajax( /* ... */ );
}
var requests = [];
for(var i = 0; i < 10; i++)
{
    var xhr = jQueryFunction( /* ... */ );
    requests.push(xhr);
}
$.when.apply($, requests).done(function(){
    // EVERYTHING IS NOW DONE, DO SOMETHING HERE
});