Javascript 在返回结果之前,如何等待jQuery.ajaxComplete在promise.done内完成?
我试图在jQuery的ajaxComplete中设置一个值,并在承诺完成时请求该值。我遇到的问题是jQuery的ajaxComplete在promise.done之后运行Javascript 在返回结果之前,如何等待jQuery.ajaxComplete在promise.done内完成?,javascript,jquery,promise,deferred,Javascript,Jquery,Promise,Deferred,我试图在jQuery的ajaxComplete中设置一个值,并在承诺完成时请求该值。我遇到的问题是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, bu
$(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结合使用。
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");
}
}
您必须自己实现它,例如,通过将处理程序的执行延迟一个额外的超时:
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
});
谢谢,这很有帮助。在我的例子中,值总是被设置的,所以我还需要保证在延迟解析时数据不会过时。也许我需要在ajaxComplete中以某种方式对其进行版本设置?这是正确的,但公平地说,我不会。相反,我将包装$。发布自己的并通过该函数添加自己的ajaxComplete
逻辑,这将使您在首先执行的内容中有更多的细粒化,而不必求助于超时之类的东西。我使用全局ajaxComplete来查找特定的头。当它找到它们时,它将向用户显示一条消息并增加一个计数器。我觉得这是一个正确的地方,因为所有ajax请求都是在全局范围内完成的。promise.done有一个陈旧版本的递增计数器信息。我希望我不必对$.post做任何特殊的处理,因为这样我就必须对每一个需要正确递增计数器值的$.post进行处理。