Jquery 如何确定一系列GET请求何时完成?

Jquery 如何确定一系列GET请求何时完成?,jquery,html,ajax,Jquery,Html,Ajax,我希望执行一系列get请求,然后在所有get请求完成后执行一些操作。下面是我的代码的起点,但是由于get请求是异步的,所以“在所有getJSON请求完成后执行一些操作”会立即执行 这方面的正确/最佳方式是什么 ... $.each(array, function(i, element) { // setup url and params $.getJSON(url, params, function(data) { // do work on data }

我希望执行一系列get请求,然后在所有get请求完成后执行一些操作。下面是我的代码的起点,但是由于get请求是异步的,所以“在所有getJSON请求完成后执行一些操作”会立即执行

这方面的正确/最佳方式是什么

...
$.each(array, function(i, element) {
    // setup url and params
    $.getJSON(url, params, function(data) {
        // do work on data
    }
}
// do some action after all getJSON requests finish
...
我曾考虑过为数组中的元素数量设置一个计数器,并将其递减,然后在其达到零时执行操作,但我担心该操作不是原子操作,可能会遇到错误。下面是我所想的一个例子,但我不确定它是否总是正确工作

...
$.each(array, function(i, element) {
    var items_remaining = array.length;
    // setup url and params
    $.getJSON(url, params, function(data) {
        // do work on data
        items_remaining = items_remaining - 1;
        if ( items_remaining === 0 ) {
            // do some action after all getJSON requests finish
        }
    }
}
....

不要担心原子性。Javascript的执行是单线程的,对“共享”数据的并发访问根本不会发生。您的回调永远不会被同时调用。您的示例看起来不错。

如果您已经控制了服务器端处理脚本,那么如何修改它以接受一个项目数组,这样就可以对它们进行批处理,而不是一次触发一个项目,并承担为每个项目建立/取消HTTP调用的所有开销?只需一个调用,您就可以让回调处理程序触发“在…之后做某事”逻辑,并且不必担心是否已经到达
.each()
循环的末尾

将其设置为同步调用还可以保证在ajax调用完成之前不会执行后处理逻辑。但是,如果处理需要“很长”的时间,这将在整个过程中锁定浏览器。不过,只需将后处理器放入函数中,并从ajax处理程序调用该函数,就可以解决这一问题


除此之外,带计数器的选项是唯一实用的选项。

不过,对于0的情况,您也必须小心。如果“array”的长度为零,那么“在所有getJSON请求完成后执行一些操作”将永远不会执行。