我在下面有这个代码,它应该返回调用的结果。我需要同步这样做,以便我知道一切都很好,但它似乎不起作用。我做错了什么?
/* 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;
}
答案 0 :(得分:11)
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,除非您在网址中有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
});