2

以下のようなネストされたajaxリクエストがたくさんあります。以下の成功関数では多くのことが起こっています。成功が完了するとトリガーされる成功のようなものが必要です。complete(jqXHR, textStatus)ただ発砲しているようでsuccess、うまくいかないと思い.ajaxComplete()ます。

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

解決策

(finished + ajax)と呼ばれる代替プラグインが作成されました$.ajax()$.fajax()ぜひチェックして、感想を聞かせてください。https://github.com/reggi/fajax(かなりよく文書化されています)。

4

3 に答える 3

2

私はあなたが何を求めているのか完全にはわからないので、私がオフキルターであるなら許してください、しかし私はあなたが次のようなものを望むか​​もしれないと思います:

$.ajax({
  url: 'api/periods.json',
  dataType: 'json',
  success: function(d1){
   //more nested ajax requests
  },
}).done(function(msg){
     alert("Every Ajax Call is Complete!");
});
于 2012-04-27T02:53:29.680 に答える
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({...});
    }
});

これによりクロージャが作成されるので、メモリを大量に消費するようなことは行わないでください。問題はありません。

于 2012-04-27T03:10:25.923 に答える
0

.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({
   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 
   });

   },
});
于 2012-04-27T03:17:41.690 に答える