2

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

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

4 回答 4

11

getJSON 不支持 async:false

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

根据文档,getJSON相当于:

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

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

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

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


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

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

JSON-PJSON不同(除非您在 URL 中有或类似,getJSON否则不会执行 JSON-P ),并且 JSON-P本质上是异步的。与真正的 ajax 调用不同,不可能使 JSON-P 同步。callback=?XMLHttpRequest

于 2013-03-07T22:17:14.553 回答
2

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

在内部,如果您查看doc 页面$.getJSON()它会告诉您,如果 ajax 请求是跨域的并且是针对 JSONP 的,那么它不支持.$.ajax()$.ajax()async: false

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

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

于 2013-03-07T22:19:29.743 回答
1

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

$.ajaxSetup({
    async: false
});

原始答案:是否可以将 async:false 设置为 $.getJSON 调用

于 2018-01-24T16:30:33.393 回答
0

$.getJSON是 的简写$.ajax

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

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

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

尝试这样做:

$.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);
}
于 2013-03-07T22:23:19.743 回答