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

时间:2010-10-25 20:31:18

标签: 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
    }
}
// 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
        }
    }
}
....

2 个答案:

答案 0 :(得分:1)

不要担心原子性。 Javascript在执行中是单线程的,并且不会发生对“共享”数据的并发访问。永远不会同时调用您的回调。你的例子看起来很好。

答案 1 :(得分:1)

如果您可以控制服务器端处理脚本,那么如何修改它以接受一系列项目以便对它们进行批处理,而不是一次触发一个项目并产生所有开销的开销向上/拆除每个HTTP呼叫?只需单次调用,您就可以让回调处理程序触发“执行某些操作后......”逻辑,而不必担心如果您已到达.each()循环的末尾。

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

除此之外,您使用计数器的选项是唯一的其他实用选择。