2011-08-09 5 views
1

、xmlリストの領域を繰り返し処理し、詳細情報を取得するPOST要求を行う各エリア。一度に何千ものリクエストを送信することがクライアントとサーバーのために衰弱しているので、私は次の[next]リクエストを送る前にリクエストが完了するのを待つようにフラグを設定したいと思います。

XMLは次のようになります場合:

<area>5717</area> 
<area>5287</area> 
<area>5376</area> 

、その後、XML解析はちょっとのようになります。

$(xml).find("area").each(function() { 
    doPost(); 
} 

とのdoPost()関数は、基本的に

doPost : function() { 
    $.post(...) 
} 

のように見えます私はトグル "待機"を追加したいと思いますが、これを達成する方法がわかりません。本質的な ".each"反復を保つ方法があるのでしょうか、それとももっと良いループのタイプですか?

ありがとうございます。

答えて

1

あなたは使用することができます。

$.ajaxSetup({async:false}); 

スクリプトの先頭にあなたのAJAXは、同期呼び出しを行います。

また、$.post()$.ajax()に置き換えて、asyncフラグをfalseに設定することもできます。

+0

OPが要求したようにブロックされている問題 –

+0

...が問題になります。計画が投稿を順番に実行する予定であれば、他のイベントを同時に処理する必要はないと考えることは安全です。 @sova、この仮定を確認するか拒否できますか? –

+0

ええ、私はこれがページ上のバックグラウンドタスクであるという前提の下で動作していたと思います –

3

私の頭の上にある一般的なアルゴリズム: リスト全体を配列に入れることができます。配列の最初の項目を取り出して投稿します。あなたの投稿の成功ハンドラでは、リスト内の次のインデックスを持つ関数を再帰的に呼び出すことができます。

私は非同期:偽を使用しません。なぜなら、それはブロッキング操作なので、私はOPが望んでいないと考えているからです。

+1

私は非同期:falseはPOSTを同期させ、それが正しいものではありません。 – sova

+0

@Keith、軽微なニッキー訂正:呼び出しは再帰的ではありません。コールバックは再帰呼び出しではなく、呼び出し元は以前のスタックフレームではありません。 –

+0

ええ、あなたは正しいです。Frederic –

1

setTimeoutを実行できますか?関数がまだ非同期に処理して、あなたがそこで何らかの時間を待つことを可能にします。

http://www.w3schools.com/js/js_timing.asp

setTimeout(function() {}, 5000) 
+0

setTimeoutは特定の状況では役に立ちますが信頼性は低くなります。これは〜10,000ポストのリクエストがあります(詳細な情報を取得して地図に描画します)ので、それぞれが5秒間待っていると大きなバマーですが、マシンが待ち時間が足りない場合は、しかし、私は思考の方向を感謝する=) – sova

+1

@マット、w3schoolsを引用して再考してください。 http://w3fools.com/をご覧ください。 –

+0

@フレデリック・ハミディ、リンクをありがとう。 – Matt

1

あなたのsuccessコールバックから次の要素へ<area>引数として処理するための要素、およびチェーンを取るためにあなたのdoPost()機能をリファクタリングすることができます。以下のような何か:

(function doPost($area) { 
    if ($area.length > 0) { 
     $.post({ 
      // your options, 
      success: function() { 
       // your success handling... 
       doPost($area.next("area")); 
      } 
     }); 
    } 
})($(xml).find("area").first()); 

EDIT:はたぶん、上記のコードは確かに少しもコンパクトでした。

基本的には、目的は、処理が停止した場合、それは次の<area>処理するための要素、または何もを含むjQueryオブジェクトをとるようにあなたの関数をリファクタリングすることです:

function doPost($area) { 
    if ($area.length > 0) { 
     // Perform POST request and call ourselves from success callback 
     // with next <area> element (or nothing if there's no such element). 
    } 
} 

を次に最初<area>でこの関数を呼び出します処理する要素:

doPost($(xml).find("area").first()); 

私の答えの最初のコード部分は、両方同時に行います。関数はJavaScriptでfirst-class objectsです。定義を囲んで括弧で囲んで、通常の引数リストを提供し、括弧で囲んで、定義した関数を呼び出すことができます。

+0

非常に涼しい!多くのフレデリックに感謝します! – sova

+0

あなたは構文について詳しく説明できますか?末尾の行...})($(xml)...多少ぼんやりしています – sova

+1

@sova、私はおそらくあまりにも多くのコードを圧縮した、私の更新された答えを参照してください。再帰的またはコールバックチェーンを作成し、同じステートメントでそれを開始してください。あなたの走行距離は、もちろん異なるかもしれません:) –

関連する問題