getJSON不尊重异步:false

时间:2013-03-07 22:15:48

标签: jquery synchronous

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

/* 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;
}

4 个答案:

答案 0 :(得分:11)

  

getJSON不尊重异步:false

getJSON 没有async: false选项。你必须使用ajax

根据文档,getJSON相当于:

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

...您可以轻松添加async: false选项(目前,预先警告jQuery将不再支持此选项)。

  

我需要同步这样做,以便我知道一切都很好

您不需要同步执行“知道一切都很好”,完全可以(和正常)异步处理结果(无论是“好”还是错误)。


在您对问题的评论中,您写道:

  

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

JSON-PJSON不同(getJSON不执行JSON-P,除非您在网址中有callback=?或类似内容),并且JSON- P 固有异步。与通过XMLHttpRequest的真正的ajax调用不同,不可能使JSON-P同步。

答案 1 :(得分:2)

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

在内部,$.getJSON()使用$.ajax(),如果你查看$.ajax()的{​​{3}},就会告诉你,如果ajax请求是跨域的,那就是JSONP,它不支持async: false

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

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

答案 2 :(得分:0)

$.getJSON$.ajax的缩写。

  

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

     

$。AJAX({    dataType:“json”,    url:url,    数据:数据,    成功:成功   });

您会注意到没有选项可以通过异步选项。您尝试添加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);
}

答案 3 :(得分:0)

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

$.ajaxSetup({
    async: false
});

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