2012-02-25 62 views
0

我有一个getJSON脚本,请帮助解决方案。一些getJSON的工作,并等待完成

$.getJSON('data1_get.php', {dbase: 'file1', param: '0'}, function(data_1) { 
    $.getJSON('data2_get.php', {dbase: 'file2', param: '1'}, function(data_2) { 
    for (var i=0; i<data_1.length; i++) { // about 4 rows 
     for (var k=0; k<data_2.length; k++) { // about 7 rows 
     if (data_1[i].type == data_2[k].type) { 
      if (data_2[k].switch=="1") { // possible many process 
      // check.php needed time about 3 seconds for 1 process 
      $.getJSON('check.php', {param: data_2[k].turnOn}, function(data_3) { 
       // not work 
       if (data.status) { 
       alert('working for '+data_2[k].title);\n"; 
       } 
      }); 
      } 
     } 
     } 
    } 
    }); 
}); 

我的问题是:我怎样才能迫使它等待,而不是继续下去,直到我们从Ajax请求的所有回调?

谢谢!

+0

你为什么要强迫它等待?如果你这样做,你会冻结浏览器直到它完成。 – 2012-02-25 04:04:41

+0

是的,因为那个脚本刚开始运行一次。 – user1232007 2012-02-25 04:14:14

+0

为什么要麻烦ajax,如果它的第一次运行?为什么不在你调用的php文件中执行操作,并且jsut在文档的头部吐出json结果,如:' – prodigitalson 2012-02-25 04:17:52

回答

0

如果我理解正确,您希望在收到每个项目的响应后执行回调。在回调中,我会在收到每个回复后增加一个计数器,并检查计数器是否与项目总数相同。如果是,请致电最终回调。 JavaScript是单线程的,所以没有并发问题。

0

您可以使用$.ajaxasync: false,如例如,在这里:

然而,看文档:

其中(为async参数),它说这一点,因为预期:

请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

也就是说,如果你做了你想做的事,你可能会阻止浏览器,直到所有的请求完成。您似乎暗示有很多事情正在进行,这可能会阻止用户长时间在网页上做很多事情。对于用户体验来说不是一件好事...

异步调用是一个更好的选择 - 它们不会阻止浏览器用户界面,但您必须管理循环 - 展开自己,不幸的是,响应的代价......你需要做的是首先为你想要做的所有调用制作一个参数列表,然后异步地逐个调用它们,在回调函数中再次调用它们。看看这个插件,你可以使用这个:

0

基本上,你要利用回调。

在jQuery中,它可能是这样的:

$.ajax("/someresource", { 
    success: function() { 
     $.ajax("/somethingelse", { 
      success: function() { 
       alert("This happens after the request completes with a 200!"); 
      } 
     }); 
    } 
}); 

参考jQuery Ajax docs以获取更多信息。请记住,功能如get,postgetJSON将遵循此功能,因此它们的行为将类似。