Javascript从多个回调中返回值

时间:2013-10-04 17:32:45

标签: javascript

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

                    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。为什么?怎么解决?

1 个答案:

答案 0 :(得分:2)

您可以使用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

});