jQuery Ajax:如何等到*async*请求成功完成后再继续?

JQo*_*sed 7 ajax jquery

我在制作ajax快速功能性方面遇到了问题.这是伪/原型代码:

function blah1(arg1){//arg1 is an array, roughly 10 elements

var arr[];

$.each(arg1, function(i){
//blah code

    $.ajax({
        //blah options
        async:   true,
        success: function(data){
            arr[i] = data.someInt;
        }//end success
    });//end ajax
}//end each

return arr;
}//end function
Run Code Online (Sandbox Code Playgroud)

基本上,我发送一个ajax并需要返回的数据进行进一步处理.

如果我将async设置为true,则函数会立即返回空的'arr'数组,因此整个脚本都会失败.但是,如果我将异步设置为false,那么它可以工作,但需要很长时间.

我见过这个$ .ajaxQueue(); 事情,但坦率地说,我根本不理解它,我不知道它是否会起作用.

所以问题是,首先,有没有什么方法可以同时异步发送所有的ajax请求,让函数等待并在所有ajax完成后返回arr []?如果没有,ajaxQueue会在我的情况下工作吗?(粗略的例子,请?)

Ray*_*nos 5

使用jQuery 1.5 deferred's我会选择这个:

function blah1(arr, callback){
    $.when($.map(arr, function(val, i){
        $.ajax({
            //blah options
            async:   true
        });
    }).toArray()).then(function(resultsArr) {
         callback(resultsArr);
    });
}
Run Code Online (Sandbox Code Playgroud)

问题是你试图在异步ajax调用完成之前返回函数中的数组.这实际上是不可能的,所以你需要将回调传递给blah.

你在这里做的是将你的对象数组映射到jqXHR对象(它们是延迟对象).然后将该延迟对象数组传递给$.when.

$.when获取一个数组,然后允许您.then在整个数组从ajax调用完成加载时运行该函数.然后,您将resultsArr传入作为.then函数的参数.

如果您在ajax成功调用中操作返回值,则无法使用$.ajax和使用return相同的函数.


Rub*_*ord 4

您可以使 Ajax 调用同步,您似乎知道这一点,我个人会重构我的代码,以便 ajax 调用的成功方法,然后触发对另一个函数的调用。

$.ajax({
        //blah options
        async:   true,
        success: function(data){
            arr[i] = data.someInt;
            myCall(arr[i]);
        }//end success
    });//end ajax
Run Code Online (Sandbox Code Playgroud)