【问题标题】:getJSON does not honor async:falsegetJSON 不支持 async:false
【发布时间】:2013-03-07 22:15:48
【问题描述】:

我在下面有这段代码,它应该返回调用的结果。我需要同步执行此操作,以便我知道一切都很好,但是它似乎不起作用。我做错了什么?

/* jQuery library:
 * http://code.jquery.com/jquery-1.9.1.min.js
 */
function getJSON(url){
    var result;
    $.getJSON(url, { async: false, success: function(data) {
        result = data;
        alert(data); // **Edit**: also undefined
    }});
    alert(result); // undefined
    return result;
}

【问题讨论】:

  • jsonp?这是我正在使用的代码。
  • 您介意告诉我们您的网址是什么(或类似)吗?
  • getJSON的data参数是用来向服务器发送数据的,不是设置参数。即便如此,你还是用错了。为什么要做async: false?除非您是网络工作者,否则这是一个糟糕的主意。

标签: jquery synchronous


【解决方案1】:

getJSON 不支持 async:false

getJSON 没有没有async: false 选项。为此,您必须使用 ajax

根据文档,getJSON 相当于:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

...您可以轻松地向其中添加 async: false 选项(现在,请注意 jQuery 将放弃对它的支持)。

我需要同步执行此操作,以便我知道一切都很好

您不需要同步执行任何操作来“知道一切都很好”,完全有可能(并且正常)异步处理结果(无论是“好”还是错误)。


在关于您问题的 cmets 中,您写道:

jsonp?这是我正在使用的代码。

JSON-PJSON 不同(并且getJSON 不会执行 JSON-P,除非您在 URL 中有 callback=? 或类似名称),并且 JSON-P 是固有的强>异步。与通过 XMLHttpRequest 进行的真正 ajax 调用不同,不可能使 JSON-P 同步。

【讨论】:

  • 这不太对。 $.getJSON() 在内部使用 $.ajax()
  • @jfriend00: 哪部分不对? getJSON 没有 async: false 选项。如果您想使用该选项,您必须直接致电ajax
  • 不正确的部分是使用$.ajax() 也无法解决问题。您也不能使用 $.ajax() 进行跨域 JSON 请求。所以你建议使用$.ajax() 是不对的。
  • @jfriend00:我从来没有说过你可以(尽管你实际上是不正确的:你可以通过CORS进行跨域同步请求;只是不能通过JSON -P)。我说你可以直接使用ajax来设置async: false。我没有说任何关于跨域请求的事情。如果您在给我带来困难之前再次通读一遍,我将不胜感激。 :-) 如果这是你的反对意见,我不得不说,这是非常令人惊讶的。
【解决方案2】:

$.getJSON() 不支持async: false,甚至无法将该选项传递给$.getJSON()(查看jQuery doc 中的参数)。

在内部,$.getJSON() 使用$.ajax(),如果您查看doc page$.ajax(),它会告诉您如果ajax 请求是跨域的并且它是针对JSONP 的,它不支持@987654329 @。

这样做的原因是跨域 JSON 请求是使用 JSONP 实现的,根据定义,它是动态插入的 <script> 标签,只能是异步的。不能同步。

如果是跨域的,您需要将请求编码为异步的,如果不是跨域的,则直接使用$.ajax()

【讨论】:

    【解决方案3】:

    我只是在getJSON之前插入这段代码:

    $.ajaxSetup({
        async: false
    });
    

    原答案:Is it possible to set async:false to $.getJSON call

    【讨论】:

      【解决方案4】:

      $.getJSON$.ajax 的简写。

      这是一个简写的Ajax函数,相当于:

      $.ajax({ 数据类型:“json”, 网址:网址, 数据:数据, 成功:成功 });

      您会注意到没有传递异步选项的选项。您尝试添加async: false 的参数实际上是将通过ajax 请求发送到url 的数据。

      尝试这样做:

      $.ajax({
        dataType: "json",
        url: url,
        async: false,
        data: data,
        success: success
      });
      

      还有,你的声明

      我需要同步执行此操作,以便我知道一切都很好

      不正确。您可以从异步回调中“知道一切都很好”。如果您这样编写示例代码,您的示例代码将完全按照您在上面尝试执行的操作:

      function getJSON(url){
          var result;
          $.getJSON(url, function(data) {
              alert(data);
              // do other stuff with data, call other methods etc. etc.
          });
      }
      

      您甚至可以单独定义回调函数并将其传递给$.getJSON,如下所示:

      function jsonCallback(data) {
          alert(data);
          // do other stuff with data, call other methods etc. etc.
      } 
      function getJSON(url){
          var result;
          $.getJSON(url, jsonCallback);
      }
      

      【讨论】:

      • "...如果你这样写的话,就在上面:"但是什么时候设置并返回结果呢?
      • 您无需设置或退回即可使用。无论您想用它做什么,只需在回调中执行即可。如果您想缓存或保留它,您可以通过执行window.lastJsonResult = data; 将其存储在窗口(全局)上,但这也可以异步工作。坚持同步的唯一好处是整个系统在您等待时锁定,大多数人会认为这是一个缺点,而不是一个优点。
      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多