2011-09-28 16 views
1

jQueryや他のライブラリではなく、javascriptを使用して成功したajaxの戻り値を追跡する方法を見つけようとしています。私がしたいのは、関数が呼び出されたときに読み込みグラフィックを表示し、すべての結果が返されたときにグラフィックをクリアすることです。私の関数は入力を分割し、定義された数のajaxリクエストを呼び出します。javascript - 成功したajaxリクエスト/返信を追跡する

私はそれを行うための直接的な方法はないことを読んだ。成功したリクエストを数える関数を設定しようとしていますが、私は解決できない論理的な障壁にぶつかっています。私の基本的な概要は以下の通りです:

TIAのソリューションを更新するために、編集

。グローバル変数 私の作業コードのアウトラインが、私は、関数countajaxはCTの比較==合計関数を呼び出すことなく行うことができ、必要ではないと仮定し

var ct = 0;//declare outside of function as global 


function ajaxcallback(...) { 
... 
if (success) 
{ 
//output/do something 
ct++; //increase global ct by 1 

countajax (total);//call countajax 

} 
}//end function 

function countajax (total) 
{ 
    if (ct == total) 
    { 
    //turn off loading graphic 
    } 
}//end countajax 

あるよう

ソリューションは、CTを作成することですcountajax。

+0

'if'ブロックに2番目の' = 'がありません。 –

+0

アダムに感謝しますが、それは問題を解決しません。 – Jamex

答えて

0

は、実際にこれを行うには非常に簡単な方法がありますこれは:

(function() { 
    var ajax1_done = ajax2_done = ajax3_done = false; 

    function ajax1_callback() { 
     ajax1_done = true; 
     run_when_all_is_done(); 
    } 

    function ajax2_callback() { 
     ajax2_done = true; 
     run_when_all_is_done(); 
    } 

    function ajax3_callback() { 
     ajax3_done = true; 
     run_when_all_is_done(); 
    } 

    function run_when_all_is_done() { 
     if(ajax1_done && ajax2_done && ajax3_done) { 
     //do stuff here 
     } 
    } 
})(); 
+0

Martinさん、ありがとう、私はこれが素晴らしいと思いますが、 "ajax_done"変数を動的に生成する必要があります。あなたのソリューションとBriansの解決策は、私がグローバル変数を宣言しなければならなくなったことに私は気づきました。私は一度それがテストされたソリューションを共有します。 – Jamex

+0

グローバル変数は必要ありません。クロージャを使用してください。どのように私の更新された答えを見てください。コードをラップする即値関数は、その内部で宣言された変数のローカルスコープとして機能します。 –

0

これを行う1つの方法は、作成したリクエストの数を追跡する変数と、受信したレスポンスの数を追跡する変数を保持することです。その後、すべてのAjax呼び出しを開始した後、レスポンス数変数がtotal requests変数に一致するかどうかをチェックするポーラー(setInterval)を開始します。

コールごとにAJAXコールバックの内側からの方法、およびすべてのAJAX呼び出しが完了している場合は、この関数は唯一の実際のように、何もしないことを確認してください。

var totalRequests = 0, 
    successfulRequests = 0, 
    poller = null; 

// psuedo code 
totalRequests++; 
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */); 

totalRequests++; 
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */); 

totalRequests++; 
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */); 

// run poller after you've kicked off all your ajax requests 
poller = window.setInterval(function(){ 
    if(totalRequests === successfulRequests){ 
    alert("all ajax finished"); 
    window.clearInterval(poller); 
    poller = null; 
    } 
},100); 
+0

ブライアンに感謝、私は方法を試し、私の状況に適用されることを願っています。 – Jamex

関連する問題