等到所有jQuery Ajax请求都完成了吗?


675

我如何让一个函数等到所有jQuery Ajax请求都在另一个函数中完成之后?

简而言之,在执行下一个请求之前,我需要等待所有Ajax请求完成。但是如何?


您如何称呼原始的ajax请求?
NakedBrunch 2010年

2
“完成”是什么意思?我将其理解为“所有请求是否成功完成”(已解决或被拒绝)。但您的意思可能是“所有请求已成功完成”(已解决)。看到所有的变化api.jquery.com/category/deferred-object
阿德里安要

Answers:


911

jQuery现在为此目的定义了一个when函数

它接受任意数量的Deferred对象作为参数,并在它们全部解析后执行一个函数。

这意味着,如果您要发起(例如)四个ajax请求,然后在完成后执行操作,则可以执行以下操作:

$.when(ajax1(), ajax2(), ajax3(), ajax4()).done(function(a1, a2, a3, a4){
    // the code here will be executed when all four ajax requests resolve.
    // a1, a2, a3 and a4 are lists of length 3 containing the response text,
    // status, and jqXHR object for each of the four ajax calls respectively.
});

function ajax1() {
    // NOTE:  This function must return the value 
    //        from calling the $.ajax() method.
    return $.ajax({
        url: "someUrl",
        dataType: "json",
        data:  yourJsonData,            
        ...
    });
}

在我看来,它使语法清晰明了,并避免涉及任何全局变量(例如ajaxStart和ajaxStop),这些全局变量在页面开发时可能会产生有害的副作用。

如果您事先不知道需要等待多少个ajax参数(即,您想使用可变数量的参数),它仍然可以完成,但是有点棘手。请参阅将Deferreds数组传递给$ .when()(以及在使用可变数量的参数进行故障排除时,可能是jQuery。)。

如果您需要对ajax脚本等的失败模式进行更深入的控制,则可以保存由返回的对象.when()-这是一个jQuery Promise对象,其中包含所有原始ajax查询。您可以调用.then().fail()在其上添加详细的成功/失败处理程序。


46
这应该被标记为正确答案,因为它简单,有效并且效果很好。另外,应注意,$.when返回的Promise对象不仅具有,还具有更多有用的方法.done。例如,使用.then(onSuccess, onFailure)方法,您可以在两个请求成功或其中至少一个失败时做出反应。
skalee 2012年

2
是否可以将请求ajax1..4捆扎成一个数组并将其传递?
andig

33
小心fail外壳。与不同donefail第一次失败时立即触发,而忽略其余的延期。
Ryan Mohr

1
@skalee感谢您强调onFailure可以附加功能的事实。正如我在对OP的问题的评论中指出的那样:他可能想更准确地指出他的“完成”是什么意思。“瑞安莫尔”没也有关于这个事实非常好的一点,fail表现不同的done,需要做一些进一步阅读有关Promises我猜html5rocks.com/en/tutorials/es6/promises
阿德里安要

1
使人们接触到when方法和一般的诺言是很棒的,但是我认为这不是最好的答案。如果这些ajax函数中的任何一个在行下的任何地方都创建了另一个ajax请求,然后没有将该新的Promise正确地集成到链中...这些请求将逃脱此技术。例如,如果不修改用于ajax添加到购物车行为的Shopify库,就无法使用此技术,因为它不是以“有希望”的方式编写的,并且永远不会返回它创建的xhr对象。这有意义吗?仍然是一个很好的答案!
Ziggy 2014年

292

如果您想知道所有 ajax请求何时在文档中完成,那么无论存在多少请求,都可以通过以下方式使用$ .ajaxStop事件:

$(document).ajaxStop(function () {
  // 0 === $.active
});

在这种情况下,您既无需猜测应用程序中正在发生的请求数量(可能在将来完成),也无需深入研究复杂逻辑的功能或查找正在执行HTTP(S)请求的功能。

$.ajaxStop这里也可以绑定到HTML您认为可能需要requst修改的任何节点。


更新:
如果您要坚持ES语法,则可以将Promise.all用于已知ajax方法:

Promise.all([ajax1(), ajax2()]).then(() => {
  // all requests finished successfully
}).catch(() => {
  // all requests finished but one or more failed
})

这里有一个有趣的一点是,它的作品都与Promises$.ajax请求。

这是jsFiddle演示。


更新2:
使用async / await语法的最新版本:

try {
  const results = await Promise.all([ajax1(), ajax2()])
  // do other actions
} catch(ex) { }

16
+1比其他答案要好得多,以防您必须处理带有匿名回调/关闭操作的第三方脚本。
kaiser

5
@kaiser有效点,但这不是问题要问的内容。如果您不想等待所有AJAX调用返回,那不是很好。问题是关于等待您自己进行的AJAX调用(如OP所写,在另一个函数中调用)。其他一些代码可能已经发出了另一个您不想等待的AJAX调用。
Juan Mendes

6
与when()解决方案相比,即使ajax调用的数量未知,它也可以工作。
Alexis Dufrenoy 2014年

5
与when()解决方案相比,它与其他组件不能很好地协同工作具有很大的缺点,因为它共享整个文档范围的全局状态。如果连续进行长时间的轮询,甚至可能永远不会触发。
Bergi 2014年

3
您不正确@ AdrienBe,ajaxStop会处理所有ajax请求(无论它们是否成功),就像我的话来看看这个jsfiddle.net/36votxba/2一样-Arsen
Khachaturyan

32

我通过gnarf找到了一个很好的答案,这正是我想要的东西:)

jQuery ajaxQueue

//This handles the queues    
(function($) {

  var ajaxQueue = $({});

  $.ajaxQueue = function(ajaxOpts) {

    var oldComplete = ajaxOpts.complete;

    ajaxQueue.queue(function(next) {

      ajaxOpts.complete = function() {
        if (oldComplete) oldComplete.apply(this, arguments);

        next();
      };

      $.ajax(ajaxOpts);
    });
  };

})(jQuery);

然后,您可以将ajax请求添加到队列中,如下所示:

$.ajaxQueue({
        url: 'page.php',
        data: {id: 1},
        type: 'POST',
        success: function(data) {
            $('#status').html(data);
        }
    });

37
看来您已经忘记为该答案提供正确的属性了,我已经添加了它。
Tim Post

21

使用ajaxStop事件。

例如,假设您在提取100个Ajax请求时收到了一条loading ...消息,并且希望在加载后隐藏该消息。

从jQuery 文档

$("#loading").ajaxStop(function() {
  $(this).hide();
});

请注意,它将等待该页面上完成的所有ajax请求。


5
假设您知道页面上不会再有其他AJAX请求,这不是一个很好的假设
Juan Mendes

从jQuery 1.8开始,.ajaxStop()方法仅应附加到文档。
Geomorillo

1
如果我错了,请纠正我,但是这不会把您的项目变成一个“旧式网络表单”网站吗?我的意思是,如果您的整个页面都必须等待请求才能继续,那么ajax请求的初衷是什么?
BillRuhl

@BillRuhl在我们的例子中,我正在遍历一个jQuery集合来构建新的东西,并且需要在完成一些布局调整之前了解整个集合。似乎不是特别罕见的情况。如果一堆其他的ajax内容可能正在处理中,那将是不好的,但是这里不会。
EON

21

注意:以上答案使用的功能在编写此答案时不存在。我建议使用jQuery.when()代替这些方法的方法,但出于历史目的,我保留了答案。

--

您可能可以通过简单的计数信号量来实现,尽管如何实现它取决于您的代码。一个简单的例子就是...

var semaphore  = 0,     // counting semaphore for ajax requests
    all_queued = false; // bool indicator to account for instances where the first request might finish before the second even starts

semaphore++;
$.get('ajax/test1.html', function(data) {
    semaphore--;
    if (all_queued && semaphore === 0) {
        // process your custom stuff here
    }
});

semaphore++;
$.get('ajax/test2.html', function(data) {
    semaphore--;
    if (all_queued && semaphore === 0) {
        // process your custom stuff here
    }
});

semaphore++;
$.get('ajax/test3.html', function(data) {
    semaphore--;
    if (all_queued && semaphore === 0) {
        // process your custom stuff here
    }
});

semaphore++;
$.get('ajax/test4.html', function(data) {
    semaphore--;
    if (all_queued && semaphore === 0) {
        // process your custom stuff here
    }
});

// now that all ajax requests are queued up, switch the bool to indicate it
all_queued = true;

如果您希望此操作像{async:false}一样但不想锁定浏览器,则可以使用jQuery队列完成相同的操作。

var $queue = $("<div/>");
$queue.queue(function(){
    $.get('ajax/test1.html', function(data) {
        $queue.dequeue();
    });
}).queue(function(){
    $.get('ajax/test2.html', function(data) {
        $queue.dequeue();
    });
}).queue(function(){
    $.get('ajax/test3.html', function(data) {
        $queue.dequeue();
    });
}).queue(function(){
    $.get('ajax/test4.html', function(data) {
        $queue.dequeue();
    });
});

10
这似乎会使一个小问题变得过于复杂。
克里斯(Chris

2
其实并没有那么复杂。信号量计数是CS中的一种常见机制。但是,如果愿意,使用jQuery队列的示例也可以正常工作,而不必自己实现信号量。
BBonifield's

1
我看不到信号量计数器有问题,但是,我确实有使用四个函数来处理所产生的回调的想法。您应该先定义一个函数,然后在每个函数中引用该函数.get()。这样,至少您不会重复该代码。不仅如此,而且function(){}每次声明一次都会分配内存!如果可以调用静态定义的函数,则不是一个好习惯。
亚历克西斯·威尔克

1
@AlexisWilke这是一个有4.5年历史的答案,它旨在作为信号量和队列工作方式的一个示例。您对此考虑得有点辛苦,我认为没有必要大胆地提出要点。
BBonifield

2
好吧...我不是给您-1的人...我知道答案的确会随着年龄而增长。但是,人们一直在寻找它们,据我所知,不禁止将信息提供给可能在今天仍在使用它们的人们。
亚历克西斯·威尔克

8

javascript是基于事件的,因此您永远不要等待,而是设置钩子/回调

您可能只可以使用jquery.ajax的成功/完成方法

或者您可以使用.ajaxComplete

$('.log').ajaxComplete(function(e, xhr, settings) {
  if (settings.url == 'ajax/test.html') {
    $(this).text('Triggered ajaxComplete handler.');
    //and you can do whatever other processing here, including calling another function...
  }
});

尽管youy应该发布一个伪代码,以更精确地说明如何调用ajax请求...


8

一个小的解决方法是这样的:

// Define how many Ajax calls must be done
var ajaxCalls = 3;
var counter = 0;
var ajaxCallComplete = function() {
    counter++;
    if( counter >= ajaxCalls ) {
            // When all ajax calls has been done
        // Do something like hide waiting images, or any else function call
        $('*').css('cursor', 'auto');
    }
};

var loadPersons = function() {
        // Show waiting image, or something else
    $('*').css('cursor', 'wait');

    var url = global.ctx + '/loadPersons';
    $.getJSON(url, function(data) {
            // Fun things
    })
    .complete(function() { **ajaxCallComplete();** });
};

var loadCountries = function() {
    // Do things
    var url = global.ctx + '/loadCountries';
    $.getJSON(url, function(data) {
            // Travels
    })
    .complete(function() { **ajaxCallComplete();** });
};

var loadCities = function() {
    // Do things
    var url = global.ctx + '/loadCities';
    $.getJSON(url, function(data) {
            // Travels
    })
    .complete(function() { **ajaxCallComplete();** });
};

$(document).ready(function(){
    loadPersons();
    loadCountries();
    loadCities();
});

希望会有所帮助...


虽然其他答案从技术上来说比较好,因为它更容易理解,但我真的很喜欢这个答案。真好!
2014年

4

jQuery允许您指定是否要使ajax请求异步。您可以简单地使ajax请求同步,然后其余的代码直到它们返回才执行。

例如:

jQuery.ajax({ 
    async: false,
    //code
});

42
需要注意的一件事是,使用{async:false}可以暂时锁定浏览器。 api.jquery.com/jQuery.ajax
BBonifield 2010年

30
这与标准的jQuery / Javascript实践背道而驰。AJAX始终被认为是异步的。您应该改用jQuery.when()。
SystemParadox 2012年

43
这是一个非常糟糕的主意!永远不要那样做!阻塞=根本不响应用户操作,甚至不响应滚动!(此外,异步:在jQuery 1.8
中将

5
特别是如果请求由于某种不可预测的原因而失败或花费很长时间(根据墨菲定律一定会发生!),由于如上所述的浏览器锁定,对于生产代码而言,这通常不是一个好主意。
亚历克斯(Alex)

27
这是一个非常糟糕的主意。请勿使用此答案。
牛头人2012年

2

如果您需要简单的东西;一次完成回调

        //multiple ajax calls above
        var callback = function () {
            if ($.active !== 0) {
                setTimeout(callback, '500');
                return;
            }
            //whatever you need to do here
            //...
        };
        callback();

4
它会产生一个无限循环!
Diego Favero

2
这是一个无尽的循环吗?什么时候?当AJAX永不返回时?
乔纳森


2

在@BBonifield答案的基础上,我编写了一个实用程序函数,以便信号量逻辑不会在所有的ajax调用中传播。

untilAjax 是实用程序函数,当所有ajaxCalls完成时将调用回调函数。

ajaxObjs是ajax设置对象的数组[http://api.jquery.com/jQuery.ajax/]

fn 是回调函数

function untilAjax(ajaxObjs, fn) {
  if (!ajaxObjs || !fn) {
    return;
  }
  var ajaxCount = ajaxObjs.length,
    succ = null;

  for (var i = 0; i < ajaxObjs.length; i++) { //append logic to invoke callback function once all the ajax calls are completed, in success handler.
    succ = ajaxObjs[i]['success'];
    ajaxObjs[i]['success'] = function(data) { //modified success handler
      if (succ) {
        succ(data);
      }
      ajaxCount--;
      if (ajaxCount == 0) {
        fn(); //modify statement suitably if you want 'this' keyword to refer to another object
      }
    };
    $.ajax(ajaxObjs[i]); //make ajax call
    succ = null;
  };

示例:doSomething函数使用untilAjax

function doSomething() {
  // variable declarations
  untilAjax([{
    url: 'url2',
    dataType: 'json',
    success: function(data) {
      //do something with success data
    }
  }, {
    url: 'url1',
    dataType: 'json',
    success: function(data) {
      //do something with success data
    }
  }, {
    url: 'url2',
    dataType: 'json',
    success: function(response) {
      //do something with success data
    }
  }], function() {
    // logic after all the calls are completed.
  });
}

2

如果您是从头开始的话,我强烈建议您使用$ .when()

即使这个问题有超过一百万的答案,我仍然没有发现对我的案子有用的任何东西。假设您必须处理现有的代码库,已经进行了一些ajax调用,并且不想引入promise的复杂性和/或重做整个事情。

我们可以很容易利用的jQuery .data.on并且.trigger因为永远已经jQuery的一部分功能。

码笔

关于我的解决方案的好地方是:

  • 很明显,回调确切地依赖于什么

  • 该函数triggerNowOrOnLoaded不在乎数据是否已经加载或我们仍在等待

  • 将其插入现有代码非常容易

$(function() {

  // wait for posts to be loaded
  triggerNowOrOnLoaded("posts", function() {
    var $body = $("body");
    var posts = $body.data("posts");

    $body.append("<div>Posts: " + posts.length + "</div>");
  });


  // some ajax requests
  $.getJSON("https://jsonplaceholder.typicode.com/posts", function(data) {
    $("body").data("posts", data).trigger("posts");
  });

  // doesn't matter if the `triggerNowOrOnLoaded` is called after or before the actual requests 
  $.getJSON("https://jsonplaceholder.typicode.com/users", function(data) {
    $("body").data("users", data).trigger("users");
  });


  // wait for both types
  triggerNowOrOnLoaded(["posts", "users"], function() {
    var $body = $("body");
    var posts = $body.data("posts");
    var users = $body.data("users");

    $body.append("<div>Posts: " + posts.length + " and Users: " + users.length + "</div>");
  });

  // works even if everything has already loaded!
  setTimeout(function() {

    // triggers immediately since users have been already loaded
    triggerNowOrOnLoaded("users", function() {
      var $body = $("body");
      var users = $body.data("users");

      $body.append("<div>Delayed Users: " + users.length + "</div>");
    });

  }, 2000); // 2 seconds

});

// helper function
function triggerNowOrOnLoaded(types, callback) {
  types = $.isArray(types) ? types : [types];

  var $body = $("body");

  var waitForTypes = [];
  $.each(types, function(i, type) {

    if (typeof $body.data(type) === 'undefined') {
      waitForTypes.push(type);
    }
  });

  var isDataReady = waitForTypes.length === 0;
  if (isDataReady) {
    callback();
    return;
  }

  // wait for the last type and run this function again for the rest of the types
  var waitFor = waitForTypes.pop();
  $body.on(waitFor, function() {
    // remove event handler - we only want the stuff triggered once
    $body.off(waitFor);

    triggerNowOrOnLoaded(waitForTypes, callback);
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>Hi!</body>


2

所有ajax加载完成后,我正在使用大小检查

function get_ajax(link, data, callback) {
    $.ajax({
        url: link,
        type: "GET",
        data: data,
        dataType: "json",
        success: function (data, status, jqXHR) {
            callback(jqXHR.status, data)
        },
        error: function (jqXHR, status, err) {
            callback(jqXHR.status, jqXHR);
        },
        complete: function (jqXHR, status) {
        }
    })
}

function run_list_ajax(callback){
    var size=0;
    var max= 10;
    for (let index = 0; index < max; index++) {
        var link = 'http://api.jquery.com/ajaxStop/';
        var data={i:index}
        get_ajax(link,data,function(status, data){
            console.log(index)
            if(size>max-2){
                callback('done')
            }
            size++
            
        })
    }
}

run_list_ajax(function(info){
    console.log(info)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>


赞成你的例子。
MarwaAhmad18年

2

为了扩展Alex的答案,我有一个带有可变参数和Promise的示例。我想通过ajax加载图像,并在它们全部加载后在页面上显示它们。

为此,我使用了以下内容:

let urlCreator = window.URL || window.webkitURL;

// Helper function for making ajax requests
let fetch = function(url) {
    return $.ajax({
        type: "get",
        xhrFields: {
            responseType: "blob"
        },
        url: url,
    });
};

// Map the array of urls to an array of ajax requests
let urls = ["https://placekitten.com/200/250", "https://placekitten.com/300/250"];
let files = urls.map(url => fetch(url));

// Use the spread operator to wait for all requests
$.when(...files).then(function() {
    // If we have multiple urls, then loop through
    if(urls.length > 1) {
        // Create image urls and tags for each result
        Array.from(arguments).forEach(data => {
            let imageUrl = urlCreator.createObjectURL(data[0]);
            let img = `<img src=${imageUrl}>`;
            $("#image_container").append(img);
        });
    }
    else {
        // Create image source and tag for result
        let imageUrl = urlCreator.createObjectURL(arguments[0]);
        let img = `<img src=${imageUrl}>`;
        $("#image_container").append(img);
    }
});

更新为可用于单个或多个URL:https : //jsfiddle.net/euypj5w9/


2

正如提到的其他答案一样,您可以ajaxStop()用来等待所有ajax请求完成。

$(document).ajaxStop(function() {
     // This function will be triggered every time any ajax request is requested and completed
});

如果要针对特定ajax()请求执行此操作,则最好的complete()办法是在特定ajax请求内使用method:

$.ajax({
    type: "POST",
    url: "someUrl",
    success: function(data) {
        // This function will be triggered when ajax returns a 200 status code (success)
    },
    complete: function() {
        // This function will be triggered always, when ajax request is completed, even it fails/returns other status code
    },
    error: function() {
        // This will be triggered when ajax request fail.
    }
});


但是,如果您只需要等待一些特定的ajax请求完成,该怎么办?使用精彩的javascript 承诺等待直到您要等待的这些ajax完成。我做了一个简短,易读的示例,向您展示了Promise如何与Ajax一起工作。
请看下一个例子。我曾经setTimeout澄清这个例子。

// Note:
// resolve() is used to mark the promise as resolved
// reject() is used to mark the promise as rejected

$(document).ready(function() {
    $("button").on("click", function() {

        var ajax1 = new Promise((resolve, reject) => {
            $.ajax({
                type: "GET",
                url: "https://miro.medium.com/max/1200/0*UEtwA2ask7vQYW06.png",
                xhrFields: { responseType: 'blob'},
                success: function(data) {
                    setTimeout(function() {
                        $('#image1').attr("src", window.URL.createObjectURL(data));
                        resolve(" Promise ajax1 resolved");
                    }, 1000);
                },
                error: function() {
                    reject(" Promise ajax1 rejected");
                },
            });
        });

        var ajax2 = new Promise((resolve, reject) => {
            $.ajax({
                type: "GET",
                url: "https://cdn1.iconfinder.com/data/icons/social-media-vol-1-1/24/_github-512.png",
                xhrFields: { responseType: 'blob' },
                success: function(data) {
                    setTimeout(function() {
                         $('#image2').attr("src", window.URL.createObjectURL(data));
                         resolve(" Promise ajax2 resolved");
                    }, 1500);
                },
                error: function() {
                    reject(" Promise ajax2 rejected");
                },
            });
        });

        var ajax3 = new Promise((resolve, reject) => {
            $.ajax({
                type: "GET",
                url: "https://miro.medium.com/max/632/1*LUfpOf7teWvPdIPTBmYciA.png",
                xhrFields: { responseType: 'blob' },
                success: function(data) {
                    setTimeout(function() {
                         $('#image3').attr("src", window.URL.createObjectURL(data));
                         resolve(" Promise ajax3 resolved");
                    }, 2000);
                },
                error: function() {
                    reject(" Promise ajax3 rejected");
                },
            });
        });
        
        Promise.all([ajax1, ajax2, ajax3]).then(values => {
            console.log("We waited until ajax ended: " + values);
            console.log("My few ajax ended, lets do some things!!")
        }, reason => {
            console.log("Promises failed: " + reason);
        });
        
        // Or if you want wait for them individually do it like this
        // ajax1.then(values => {
        //    console.log("Promise 1 resolved: " + values)
        // }, reason => {
        //     console.log("Promise 1 failed: " + reason)
        // });
    });

});
img {
  max-width: 200px;
  max-height: 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>Make AJAX request</button>
<div id="newContent">
    <img id="image1" src="">
    <img id="image2" src="">
    <img id="image3" src="">
</div>


0

我发现了简单的方法,它使用 shift()

function waitReq(id)
{
  jQuery.ajax(
  {
    type: 'POST',
    url: ajaxurl,
    data:
    {
      "page": id
    },
    success: function(resp)
    {
      ...........
      // check array length if not "0" continue to use next array value
      if(ids.length)
      {
        waitReq(ids.shift()); // 2
      )
    },
    error: function(resp)
    {
      ....................
      if(ids.length)
      {
        waitReq(ids.shift());
      )
    }
  });
}

var ids = [1, 2, 3, 4, 5];    
// shift() = delete first array value (then print)
waitReq(ids.shift()); // print 1

0

我的解决方法如下

var request;
...
'services': {
  'GetAddressBookData': function() {
    //This is the primary service that loads all addressbook records 
    request = $.ajax({
      type: "POST",
      url: "Default.aspx/GetAddressBook",
      contentType: "application/json;",
      dataType: "json"
    });
  },

  ...

  'apps': {
    'AddressBook': {
      'data': "",
      'Start': function() {
          ...services.GetAddressBookData();
          request.done(function(response) {
            trace("ajax successful");
            ..apps.AddressBook.data = response['d'];
            ...apps.AddressBook.Filter();
          });
          request.fail(function(xhr, textStatus, errorThrown) {
            trace("ajax failed - " + errorThrown);
          });

做得很好。我尝试了许多不同的方法来执行此操作,但是我发现这是最简单,最可重用的。希望能帮助到你


0

看我的解决方案:

1.将此函数(和变量)插入到您的javascript文件中:

var runFunctionQueue_callback;

function runFunctionQueue(f, index, callback) {

  var next_index = index + 1

  if (callback !== undefined) runFunctionQueue_callback = callback;

  if (f[next_index] !== undefined) {
    console.log(index + ' Next function avalaible -> ' + next_index);
    $.ajax({
      type: 'GET',
      url: f[index].file,
      data: (f[index].data),
      complete: function() {
        runFunctionQueue(f, next_index);
      }
    });
  } else {
    console.log(index + ' Last function');
    $.ajax({
      type: 'GET',
      url: f[index].file,
      data: (f[index].data),
      async: false,
      complete: runFunctionQueue_callback
    });
  }
}

2.根据您的请求构建一个数组,如下所示:

var f = [
           {file: 'file_path', data: {action: 'action', data: 'any_data}},
           {file: 'file_path', data: {action: 'action', data: 'any_data}},
           {file: 'file_path', data: {action: 'action', data: 'any_data}},
           {file: 'file_path', data: {action: 'action', data: 'any_data}}
        ];

3,创建回调函数

function Function_callback() {
  alert('done');
}

4.使用参数调用runFunctionQueue函数:

runFunctionQueue(f, 0, QuestionInsert_callback);
// first parameter: array with requests data
// second parameter: start from first request
// third parameter: the callback function


-4

尝试这种方式。在Java脚本函数中进行循环以等待ajax调用完成。

function getLabelById(id)
{
    var label = '';
    var done = false;
    $.ajax({
       cache: false,
       url: "YourMvcActionUrl",
       type: "GET",
       dataType: "json",
       async: false,
       error: function (result) {
         label='undefined';
         done = true;
        },
       success: function (result) {
            label = result.Message;
            done = true;
        }
     });

   //A loop to check done if ajax call is done.
   while (!done)
   {
      setTimeout(function(){ },500); // take a sleep.
   }

    return label;
}

1
setTimeout()take a sleep。在这种情况下,您只需阻止所有选项卡,直到done变为true。
亚历克西斯·威尔克

1
我认为这是该主题的要求:“等待所有jQuery Ajax请求完成”。
ChinaHelloWorld 2015年

1
您是否测试过此代码?我的期望是,done虽然while循环仍在运行,但永远不会如此。如果while循环正在运行,则事件循环将无法继续,因此将永远不会运行对ajax成功的回调。
凯文B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.