的getJSON不接受异步:假(getJSON does not honor async:false

2019-07-21 04:46发布

我有下面这段代码,这是应该返回调用的结果。 我需要让我知道一切都很好做此同步,但它似乎并没有工作。 我究竟做错了什么?

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

Answer 1:

的getJSON不接受异步:假

getJSON 没有 async: false选项。 你不得不使用ajax为。

根据该文件, getJSON相当于:

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

......到你可以轻松地添加一个async: false选项(现在,谅解,jQuery将下探该支撑位)。

我需要同步做,所以我知道一切都很好

你不需要做任何事情同步“知道一切都很好”,这是完全可能的(正常)至(无论是“好”或错误)异步处理结果。


在对你的问题的评论,你写的:

JSONP? 这是我使用的代码。

JSON-P是不一样的JSON (和getJSON没有做JSON-P,除非你有callback=?或URL类似),和JSON-P 本质上是异步的。 不同于通过一个真正的Ajax调用XMLHttpRequest ,它不可能让JSON-P同步。



Answer 2:

$.getJSON()不支持async: false ,也没有办法,甚至传递选项$.getJSON()看看在参数jQuery的文档 )。

在内部, $.getJSON()使用$.ajax()如果你看一下文档页面的$.ajax()它会告诉你在那里,如果AJAX请求是跨域,它是为JSONP,它不支持async: false

这样做的原因是,跨域JSON请求与JSONP实现,其通过定义一个动态插入<script>标签只能是异步的。 它不可能是同步的。

您将需要编写您的要求是异步的,如果它是跨域或使用$.ajax()直接,如果它不是跨域。



Answer 3:

$.getJSON是速记$.ajax

这是一个简写的Ajax功能,这相当于:

$阿贾克斯({数据类型: “JSON”,网址:网址,数据:数据成功:成功});

你会注意到是通过异步选项的选项。 您尝试添加的参数async: false实际上是将被发送到数据url与Ajax请求。

尽量不要做这样的:

$.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);
}


Answer 4:

我刚插入的getJSON在此之前的代码:

$.ajaxSetup({
    async: false
});

原来的答复: 是否有可能设置异步:假以.getJSON $通话



文章来源: getJSON does not honor async:false