有一些对象,它们使用并行的ajax请求进行扩展。当最后一个请求完成时,应该处理数组。我看到的唯一解决方案是:
function expandArray(objects, callback){
number_of_requests=objects.length-1;
for(i in objects){
$.getJSON(request,function(){
//expanding array
if(--number_of_reuests==0){
callback();
}
});
}
}
但是,当请求并行执行时,存在竞争条件的可能性。变量number_of_requests可以由两个“线程”同时编辑。如何避免竞争条件的机会?
答案 0 :(得分:2)
是否可以重新编写您的AJAX以便一次性完成所有请求?系统的这一部分将是最大的瓶颈并且可能变得棘手(正如你已经发现的那样),因此你提出的要求越少越好。
我能想到的另一种方法是,如果每个请求都改变了它的相关对象,设置了一个标志值或者什么,然后你遍历所有的对象来检查是否所有的标志都已经设置好了。
答案 1 :(得分:1)
不是Javascript单线程吗?你谈到的那种情况不会发生。
答案 2 :(得分:0)
它更复杂,但我建议使用第三个函数来监控结果。像这样:
1)启动监视器 - 使用适当的间隔监视器(使用间隔进行此处测试很重要 - 一个简单的循环会将JS引擎紧密锁定)请求A和B的结果。
2)致电请求A.
3)呼叫请求B.
4)请求B完成 - 回调函数设置“B All Done!”值。
5)请求A完成 - 回调函数设置“A All Done!”值。
6)监视器识别出两个请求都已完成,并且调用函数使用来自两者的数据。
更简单地说,这是“依赖”(多次调用)到“监视”(检查依赖关系的函数)到“完成”(当所有准备就绪时要采取的行动)。
您可以将回调和完成函数创建为嵌套函数,以维护封装并减少全局范围内的“小”。
您可以根据需要扩展您的依赖项。