在返回结果之前,如何在promise.done中等待jQuery.ajaxComplete?

时间:2014-11-30 20:19:32

标签: javascript jquery promise deferred

我正在尝试在jQuery的ajaxComplete中设置一个值,并在promise完成时请求该值。我遇到的问题是jQuery的ajaxComplete在promise.done之后运行。

$(document).ajaxComplete(function (e, jqXhr) {
    // Set a value here
});

var promise = $.post(url,{});
promise.done(function(){
    // Ask for the value here, but wait on ajaxComplete before returning it
});

有什么方法可以推迟返回值,直到jQuery的ajaxComplete完成之后?我查看了jQuery的延迟方法,但我不确定如何将它与ajaxComplete结合使用。

1 个答案:

答案 0 :(得分:1)

ajaxComplete为此案例提供了无钩子。在解决延迟后,事件将始终触发。我们可以在源代码中看到它:

// Complete
completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);

if (fireGlobals) {
    globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
    // Handle the global AJAX counter
    if (! (--jQuery.active)) {
        jQuery.event.trigger("ajaxStop");
    }
}

您必须自己实现它,例如通过额外的超时推迟执行then处理程序:

 function defer(val){
     var d = $.Deferred();
     setTimeout(function(){ d.resolve(val); }, 0);
     return d.promise();
 }

这意味着:

var promise = $.post(url, {}).then(defer);
promise.done(function(){
   // all here
});