`$ .when()。done()`在执行时评估它的参数吗?

时间:2013-09-07 00:04:00

标签: jquery

我有以下代码可能没有做我想要的。

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完成之前返回吗?

1 个答案:

答案 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将出现在日志中。