Javascript 触发器成功处理程序已完成执行,带有嵌套的ajax请求

Javascript 触发器成功处理程序已完成执行,带有嵌套的ajax请求,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有许多嵌套的ajax请求,如下所示。在下面的成功函数中,我有很多事情要做,我需要成功之类的东西,当成功完成时触发complete(jqXHR,textStatus)似乎是因为success而触发的,我认为这是行不通的 解决方案: 一个名为$.ajax()的替换插件$.fajax()(finished+ajax)已经创建。请检查一下,让我知道你的想法。(有很好的记录)。我不太确定你在问什么,所以如果我不太正常,请原谅,但我想你可能想要这样的东西: $.ajax({ url: 'api/per

我有许多嵌套的ajax请求,如下所示。在下面的成功函数中,我有很多事情要做,我需要成功之类的东西,当成功完成时触发
complete(jqXHR,textStatus)
似乎是因为
success
而触发的,我认为这是行不通的

解决方案


一个名为
$.ajax()
的替换插件
$.fajax()
(finished+ajax)已经创建。请检查一下,让我知道你的想法。(有很好的记录)。

我不太确定你在问什么,所以如果我不太正常,请原谅,但我想你可能想要这样的东西:

$.ajax({
  url: 'api/periods.json',
  dataType: 'json',
  success: function(d1){
   //more nested ajax requests
  },
}).done(function(msg){
     alert("Every Ajax Call is Complete!");
});

我不完全确定你在问什么,所以请原谅我,如果我不正常,但我想你可能会想要:

$.ajax({
  url: 'api/periods.json',
  dataType: 'json',
  success: function(d1){
   //more nested ajax requests
  },
}).done(function(msg){
     alert("Every Ajax Call is Complete!");
});

您可以为jQuery.ajax创建一个包装函数,使其更简洁:

var started = 0, done = 0;
var globalHandler = function(){
    //do stuff when all success handlers are done
}
function handleAjax(args){
    var _success = args.success || function(){};
    args.success = function(jqXHR, textStatus){
        _success(jqXHR, textStatus);
        done++;
        if(done >= started)
             globalHandler();
    }
    var ajax = $.ajax(args);
    started++;
    return ajax;
}
用法


这将创建一个闭包,因此不要在其中执行任何疯狂的内存密集型操作,您应该会很好。

您可以为jQuery.ajax创建一个包装函数,使其更简洁:

var started = 0, done = 0;
var globalHandler = function(){
    //do stuff when all success handlers are done
}
function handleAjax(args){
    var _success = args.success || function(){};
    args.success = function(jqXHR, textStatus){
        _success(jqXHR, textStatus);
        done++;
        if(done >= started)
             globalHandler();
    }
    var ajax = $.ajax(args);
    started++;
    return ajax;
}
用法

这将创建一个闭包,因此不要在其中执行任何疯狂的内存密集型操作,您应该会很好。

您可能需要.queue()或.Defered

$("#el").queue("queue_name",function(){        
    $.ajax({
       url: 'api/periods.json',
       dataType: 'json',
       success: function(d1){
           //more nested ajax requests
           $("#el").dequeue("queue_name"); // tell queue success is complete
       },
    });
}).queue("queue_name",function(){
   //do something you want when success is complete       
})
$("#el").dequeue("queue_name"); // start to execute
或$.Deferred()

您可能需要.queue()或.Defered

$("#el").queue("queue_name",function(){        
    $.ajax({
       url: 'api/periods.json',
       dataType: 'json',
       success: function(d1){
           //more nested ajax requests
           $("#el").dequeue("queue_name"); // tell queue success is complete
       },
    });
}).queue("queue_name",function(){
   //do something you want when success is complete       
})
$("#el").dequeue("queue_name"); // start to execute
或$.Deferred()



“成功完成时触发”是指请求成功完成还是成功处理程序完成执行?成功处理程序完成时<代码>成功是在请求完成时触发的。这在全局范围内是很难做到的,ajax是异步设计的,因此不知道在“更多嵌套的ajax请求”中要做什么,就没有真正简单的答案。从技术上讲,您的成功处理程序可以在嵌套ajax请求完成之前完成。@Kroehre我想我明白了。我只是在检查他们是否是一个内置的简单方式来做到这一点。但我想不会,谢谢!“成功完成时触发”是指请求成功完成还是成功处理程序完成执行?成功处理程序完成时<代码>成功是在请求完成时触发的。这在全局范围内是很难做到的,ajax是异步设计的,因此不知道在“更多嵌套的ajax请求”中要做什么,就没有真正简单的答案。从技术上讲,您的成功处理程序可以在嵌套ajax请求完成之前完成。@Kroehre我想我明白了。我只是在检查他们是否是一个内置的简单方式来做到这一点。但我想不会,谢谢
.done()
成功触发
done()
success
本质上是一样的。成功完成时未触发。Hmmm。可能尝试创建一个包含成功后代码的函数,并在成功函数末尾调用它。是否尝试添加
async:false
选项?就在几分钟前,我在工作中遇到了这个问题,这就解决了我的问题。请看这个。您希望它是异步的。
.done()
成功触发
done()
success
本质上是一样的。成功完成时未触发。Hmmm。可能尝试创建一个包含成功后代码的函数,并在成功函数末尾调用它。是否尝试添加
async:false
选项?就在几分钟前,我在工作中遇到了这个问题,这就解决了我的问题。请看这个。您希望它是异步的。我的ajax请求位于
.submit(函数(事件){
?这是如何工作的?如果其中有多个嵌套的ajax请求,您仍然无法知道所有成功处理程序何时完成执行。然后您可以使用$.when($.ajax(),$.ajax(),$.ajax()).done(函数(){})我认为
$.Defered()
选项很有希望,但遗憾的是它返回
未捕获的类型错误:对象函数(){
…开始时的每一次…
dtd.resolve();return dtd.promise();}没有方法“pipe”
是的,因此管道中的函数将在“dtd.resolve()”之后运行。也许你可以看看“创建你自己的延迟”。页面非常好。我的ajax请求在
中。提交(函数(事件){
?这是如何工作的?如果其中有多个嵌套的ajax请求,您仍然无法知道所有成功处理程序何时完成执行。然后,您可以使用$.when($.ajax(),$.ajax(),$.ajax())。完成(函数(){})我认为
$.Defered()
选项很有希望,但遗憾的是它返回
未捕获的类型错误:对象函数(){
…开始时的每一次…
dtd.resolve();return dtd.promise();}没有方法“pipe”
是的,因此管道中的函数将在“dtd.resolve()”之后运行。也许你可以看看“创建你自己的延迟”.页面非常好。我确实做了一些疯狂的内存密集型工作=[(在ajax请求的循环中循环ajax请求,并将其中一些数据存储在对象中)我的意思是,在成功处理程序闭包的上下文中,单个处理程序中的操作不会成为闭包的一部分。这实际上会在所有成功处理程序都完成执行后添加您要查找的事件。我有点困惑如何将其集成到我的示例中?将第一个块放在ans中在您的代码中,我们比其他任何东西都重要,然后简单地用“handleAjax”替换出现的“$.ajax”。我做了一些疯狂的内存密集型工作=[(在ajax请求的循环中循环ajax请求,并将其中一些数据存储在一个对象中)我的意思是,在成功处理程序闭包的上下文中,在您的单个处理程序中的操作会更多