getJSON不尊重异步:false
我在下面有这个代码,它应该返回调用的结果。 我需要同步这样做,以便我知道一切都很好,但它似乎不起作用。 我究竟做错了什么?
/* 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; }
getJSON不尊重异步:false
getJSON
没有async: false
选项。 你必须使用ajax
。
根据文档, getJSON
相当于:
$.ajax({ dataType: "json", url: url, data: data, success: success });
…你可以轻松地添加一个async: false
选项(现在,预先警告jQuery将放弃对它的支持)。
我需要同步这样做才能让我知道一切都很好
你不需要同步做任何事情来“知道一切都很好”,完全可能(和正常)异步处理结果(无论是“好”还是错误)。
在您对问题的评论中,您写道:
JSONP? 这是我正在使用的代码。
JSON-P与JSON不同 (并且getJSON
不执行JSON-P,除非您在URL中具有callback=?
或类似内容),并且JSON-P 本质上是异步的。 与通过XMLHttpRequest
进行的真正的ajax调用不同,不可能使JSON-P同步。
$.getJSON()
不支持async: false
,甚至无法将该选项传递给$.getJSON()
(查看jQuery文档中的参数)。
在内部, $.getJSON()
使用$.ajax()
,如果你查看$.ajax()
的doc页面 ,它会告诉你,如果ajax请求是跨域而且是JSONP,它不支持async: false
。
这样做的原因是使用JSONP实现了跨域JSON请求,根据定义,动态插入的标记只能是异步的。 它不能同步。
如果请求是跨域的,则需要将您的请求编码为异步,如果不是跨域,则需要直接使用$.ajax()
。
$.getJSON
是$.ajax
的简写。
这是一个简写的Ajax函数,相当于:
$ .ajax({dataType:“json”,url:url,data:data,success:success});
您会注意到没有选项可以通过异步选项。 您尝试添加async: false
to的参数实际上是将使用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); }
我只是在getJSON之前插入此代码:
$.ajaxSetup({ async: false });
原始答案: 是否可以将async:false设置为$ .getJSON调用