【问题标题】:working on some getJSON and wait until finish处理一些 getJSON 并等到完成
【发布时间】:2012-02-25 03:54:09
【问题描述】:

我有一个关于 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 请求中获得所有回调?

谢谢!

【问题讨论】:

  • 为什么要强制它等待?如果你这样做,你会冻结浏览器直到它完成。
  • 是的,因为该脚本在第一次运行时只运行一次。
  • 第一次运行 ajax 又何必呢?为什么不在你调用的 php 文件中执行操作,jsut 会在文档头部吐出 json 结果,如:&lt;script&gt; &lt;?php echo 'var '. json_encode($data1Result) . ';'; ?&gt;&lt;/script&gt;
  • 我第一次使用 PHP 操作,但使用的一些 PHP 数组(mySQL 数据)使用 javascript 操作。并由 jQuery 处理更多的统治。

标签: jquery getjson


【解决方案1】:

如果我理解正确,您希望在收到每个项目的响应后执行回调。在回调中,我会在收到每个响应后增加一个计数器,并检查计数器是否与项目总数相同。如果是,则调用最终回调。 JavaScript 是单线程的,因此不存在并发问题。

【讨论】:

    【解决方案2】:

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

    但是,请查看文档:

    正如预期的那样(对于async 参数)它这样说:

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

    也就是说,如果你做你想做的事,你可能会阻止浏览器,直到所有请求完成。正如您似乎暗示有很多事情正在发生的那样,这可能会在很长一段时间内禁止用户在您的页面上做几乎任何事情。对于用户体验来说不是一件好事......

    异步调用是一个更好的选择 - 它们不会阻塞浏览器用户界面,但您必须自己管理循环展开,不幸的是,这是响应性的代价......您需要做些什么来实现这一点就是先把所有要调用的参数列一个列表,然后一个一个异步调用,在回调函数中再调用一次。看看这个你可以使用的插件:

    【讨论】:

      【解决方案3】:

      基本上,您会想要利用回调。

      在 jQuery 中,可能是这样的:

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

      请参阅jQuery Ajax docs 了解更多信息。请记住,getpostgetJSON 等函数将遵循此函数,因此它们的行为相似。

      【讨论】:

        【解决方案4】:

        还可以查看jQuery.deferred(),这可能会对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-19
          • 2012-06-02
          • 1970-01-01
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          • 2013-11-23
          • 2022-11-16
          相关资源
          最近更新 更多