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

时间:2012-04-27 02:48:31

标签: javascript jquery ajax

我有很多嵌套的ajax请求,如下所示。我在下面的成功函数中有很多事情要做,我需要像成功那样在成功完成时触发complete(jqXHR, textStatus)似乎与success一起发射,我认为.ajaxComplete()不起作用。

$.ajax({
    url: 'api/periods.json',
    dataType: 'json',
    success: function (d1) {
        //more nested ajax requests
    },
});

已创建名为$.ajax()(已完成+ ajax)的$.fajax()替换插件。请检查一下,让我知道你的想法。 https://github.com/reggi/fajax(这是很好的记录)。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您可以为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;
}

使用

handleAjax({
    url: 'api/periods.json',
    dataType: 'json',
    success: function (d1) {
        //more nested ajax requests like this:
        handleAjax({...});
    }
});

这会创建一个闭包,所以不要在那里做任何疯狂的记忆密集的东西,你应该没事。

答案 2 :(得分:0)

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

$("#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({
   url: 'api/periods.json',
   dataType: 'json',
   success: function(d1){
   var start = function(){
       var dtd = $.Deferred();
       //more nested ajax requests---------------
       $.post("xxx",function(){
           dtd.resolve(); // when success is complete
       });


       //----------------------------------------
       return dtd.promise();
   }
   start.apply(this).pipe(function(){ 
       //do something you want when success is complete 
   });

   },
});