Jquery 如何确定一系列GET请求何时完成?
我希望执行一系列get请求,然后在所有get请求完成后执行一些操作。下面是我的代码的起点,但是由于get请求是异步的,所以“在所有getJSON请求完成后执行一些操作”会立即执行 这方面的正确/最佳方式是什么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 }
...
$.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请求完成后执行一些操作”将永远不会执行。