JavaScript异步竞争条件

时间:2009-09-10 13:07:27

标签: javascript ajax asynchronous

有一些对象,它们使用并行的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可以由两个“线程”同时编辑。如何避免竞争条件的机会?

3 个答案:

答案 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)监视器识别出两个请求都已完成,并且调用函数使用来自两者的数据。

更简单地说,这是“依赖”(多次调用)到“监视”(检查依赖关系的函数)到“完成”(当所有准备就绪时要采取的行动)。

您可以将回调和完成函数创建为嵌套函数,以维护封装并减少全局范围内的“小”。

您可以根据需要扩展您的依赖项。