Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在返回结果之前,如何等待jQuery.ajaxComplete在promise.done内完成?_Javascript_Jquery_Promise_Deferred - Fatal编程技术网

Javascript 在返回结果之前,如何等待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

我试图在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, 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进行处理。