我有以下代码可能没有做我想要的。
function ajaxTempOff(f) {
$.ajaxSetup({
async: false
});
f();
$.ajaxSetup({
async: true
});
}
function setAuthenticated() {
ajaxTempOff(function() {
$.when(
$.getJSON(window.url_root + '/show/')
).done(function(data) {
window.authenticated = data['is_user_authenticated'];
});
});
return window.authenticated;
}
在这种情况下,JSON调用是否同步执行?或者函数可以在$.getJSON
完成之前返回吗?
答案 0 :(得分:0)
在任何情况下,将立即评估提供给$.when
作为其参数的表达式。这就是JS的工作方式。
然而,这个案例很有意思。它已在$.ajaxSetup
documentation中告知:
使用任何函数的所有后续Ajax调用都将使用new 设置,除非被单个呼叫覆盖,直到下一个 调用$ .ajaxSetup()。
这就是这里发生的事情:
async
首先设置为false
,ajaxTempOff
的匿名函数然后逐步执行$.when()
调用使用$.getJSON
的当前设置评估async
表达式 - 此时为false
,所以请求是同步的.done()
部分.when().done()
链下面写的所有行都将被执行底线是setAuthenticated
将返回getJSON调用设置的值。在这种情况下。
我创建了一个类似的jsFiddle,为了清晰起见修改了关键部分:
function setAuthenticated() {
ajaxTempOff(function() {
$.when(
$.getJSON('/echo/json/')
).done(function(data) {
console.log('Done');
window.answer = 42;
});
console.log('Return');
});
return window.answer;
}
console.log( setAuthenticated() );
如果将此函数作为传递给ajaxTempOff
的回调进行调用,则可以轻松验证是否已完成'完成'将在'返回&#39>之前打印,最终记录将为42 - 因为您知道答案。 )
但是如果您按原样运行此功能(或只是注释掉' async':false设置,'将返回'将首先打印undefined
(结果处理非阻塞请求的setAuthenticated
的值 - 接下来,只有在此之后,请求才会真正提交给服务器。最后,Done
将出现在日志中。