2011-07-16 8 views
5

私はJQueryとgetでいくつかのリクエストを作成しています。すべてのAjaxリクエストが完了したらアラートを呼び出す方法は?

$.get('address1', function() { ... }); 
$.get('address2', function() { ... }); 
$.get('address3', function() { ... }); 

// This code should be runned when all 3 requests are finished 
alert('Finished'); 

したがって、処理要求がまだあるかどうかを検出し、3つの要求がすべて完了したときにマークされたコードを実行する方法はありますか。

ありがとうございました。

答えて

13

あなたはjQueryの1.5で導入されたdeferred objects[docs]を利用することができます:

$.when(
    $.get('address1', function() { ... }), 
    $.get('address2', function() { ... }), 
    $.get('address3', function() { ... }) 
).then(function() { 
    alert('Finished'); 
}); 

参考:jQuery.when

jQueryの学習センターがいいintroduction to deferred objects/promisesています。

+0

'get'の呼び出しが分割された関数内にある場合? '$ .when(function(){doRequest1(); doRequest2(); doRequest3();})。次に(function(){...});'? – Ockonal

+1

@Ockonal: '$ .get'によって返された約束オブジェクトを返すだけです:function(){return $ .get(...)}'。それで '$ .when(doRequest1()、doRequest2()、doRequest3())... 'を実行できます。ドキュメンテーションとサンプルを見てください。遅延オブジェクトは頭をかぶるのが難しいかもしれませんが、かなり強力です。 –

0
var fin1 = false; 
var fin2 = false; 
var fin3 = false; 

$.ajax({ 
    url: "address1", 
    success: function(){ 
    fin1 = true; 
    fnUpdate(); 
    } 
}); 

$.ajax({ 
    url: "address2", 
    success: function(){ 
    fin2 = true; 
    fnUpdate(); 
    } 
}); 

$.ajax({ 
    url: "address3", 
    success: function(){ 
    fin3 = true; 
    fnUpdate(); 
    } 
}); 

function fnUpdate(){ 
    if(fin1 && fin2 && fin3){ 
    alert('fin'); 
    } 
} 
+0

要求にエラーがある場合はどう?技術的には3つすべてが「終了」ですが、アラートは表示されません。 – rvighne

+0

もちろん、エラーコールバックを追加して、独自のビジネスロジックを使ってそれを処理することができます。 – ysrb

0
var count = 0; 
$.get('address1', function() { count++; ... }); 
$.get('address2', function() { count++; ... }); 
$.get('address3', function() { count++; ... }); 

var int = setInterval(function() { 
    if (count === 3) { 
     clearInterval(int); 
     alert('done'); 
    } 
}, 10); 
2
var isFinished = []; 

$.get('address1', function() { isFinshed.push["address1"]; allDone(); }); 
$.get('address2', function() { isFinshed.push["address2"]; allDone(); }); 
$.get('address3', function() { isFinshed.push["address3"]; allDone();}); 

var allDone = function(){ 
    if(isFinished.length < 3)return 

    alert('Finished'); 
};