我想做一系列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
}
}
}
....
答案 0 :(得分:1)
不要担心原子性。 Javascript在执行中是单线程的,并且不会发生对“共享”数据的并发访问。永远不会同时调用您的回调。你的例子看起来很好。
答案 1 :(得分:1)
如果您可以控制服务器端处理脚本,那么如何修改它以接受一系列项目以便对它们进行批处理,而不是一次触发一个项目并产生所有开销的开销向上/拆除每个HTTP呼叫?只需单次调用,您就可以让回调处理程序触发“执行某些操作后......”逻辑,而不必担心如果您已到达.each()
循环的末尾。
使其成为同步调用还可以保证在完成ajax调用之前不会执行后处理逻辑。但是如果处理过程需要“长时间”,这将在一段时间内锁定浏览器。简单地将后处理器放入一个函数中并从ajax处理程序调用该函数可以解决这个问题。
除此之外,您使用计数器的选项是唯一的其他实用选择。