2015-09-06 42 views
0

AJAX請求將被用戶點擊來啓動如何在所有ajax完成時觸發一個函數?

這是不可能知道有多少請求將被髮送

我試過ajaxComplete,但它不工作,我覺得它不能檢測AJAX頁面加載後。

function ajax1() { 
    $.ajax({ 
     url: 'getCount.php', 
     type: 'GET', 
     dataType: 'html', 
     success: function (data) { 
      var count = parseInt(data); 
      for (var i = 0; i < count; i++) { 
       ajax2(); 
      } 
     } 
    }); 
} 

function ajax2() { 
    $.ajax({ 
     url: 'getCount2.php', 
     type: 'GET', 
     dataType: 'html', 
     success: function (data) { 
      var count = parseInt(data); 
      for (var i = 0; i < count; i++) { 
       ajax3(); 
      } 
     } 
    }); 
} 

function ajax3() { 
    $.ajax({ 
     url: 'ajax3.php', 
     type: 'GET', 
     dataType: 'html', 
     success: function (data) { 
      //do something 
     } 
    }); 
} 
$(document).ajaxComplete(function (event, xhr, settings) { 
    alert('Complete'); 
}); 

回答

3

UPDATE:真的很好看的諾言:Promises cookbook

這樣做,是使用由$.ajax函數返回的承諾的正常方式。

改變你的函數返回.ajax調用的結果:

function ajax1(..) { 
    return $.ajax(...) 
} 

然後使用$.when使當所有的承諾都解決解決新的承諾。

$.when([ajax1(), ajax2(), ajax3()]).then(function() { alert('all complete') }) 

然而,在更復雜的情況下(就是你),你需要動態存儲所有的承諾引用,並只調用一次$.when所有承諾增加。

因此,例如,您可以創建承諾數組,其中一個用於ajax2調用,另一個用於調用ajax3

var ajax2calls = [], ajax3calls=[] 

function ajax1() { 
    return $.ajax({ 
    url: 'getCount.php', 
    type: 'GET', 
    dataType: 'html', 
    success: function (data) { 
     var count = parseInt(data); 
     for (var i = 0; i < count; i++) { 
      ajax2calls.push(ajax2()); 
     } 

     $.when(ajax2calls).then(function() { 
      $.when(ajax3calls).then(function() { 
       alert('all done') 
      } 
     }) 

    } 
    }); 
} 

此外,您可能要考慮使用Bluebird承諾庫,因爲它提供了比普通承諾/ A或承諾/ A +多了很多豐富的API。檢查map,settle, all方法等

+0

我聽說過類似的概念,那就是流量控制,它們是同一件事嗎? –

+1

@CLSo不是真的,沒有。但是,您可以考慮流量控制方面的承諾。 – vittore

+1

@CLSo忘記給你鏈接文檔http://api.jquery.com/category/deferred-object/ - jquery推遲/承諾。和https://www.promisejs.org/ – vittore

相關問題