質問

オブジェクトの配列があり、それらは並列のajaxリクエストで展開されます。最後のリクエストが完了すると、配列が処理されます。私が見る唯一の解決策は次のとおりです:

function expandArray(objects, callback){
  number_of_requests=objects.length-1;
  for(i in objects){
    $.getJSON(request,function(){
                //expanding array           
                if(--number_of_reuests==0){
                  callback();
                }
              });
  }
}

ただし、リクエストが並行して実行されると、競合状態になる可能性があります。変数number_of_requestsは、2つの「スレッド」で編集できます。同時に。競合状態の可能性を回避する方法は?

役に立ちましたか?

解決

AJAXを1回のリクエストですべて処理できるように再作成することは可能ですか?システムのその部分が最大のボトルネックになり、(わかっているように)トリッキーになる可能性があるため、リクエストの数が少ないほど良いです。

他の唯一の方法は、各リクエストが関連するオブジェクトを変更し、フラグ値などを設定し、すべてのオブジェクトをループしてすべてのフラグがまだ設定されているかどうかを確認することです。

他のヒント

Javascriptはシングルスレッドではありませんか?あなたが話すような条件は発生しません。

もっと複雑ですが、3番目の関数を使用して結果を監視することをお勧めします。このようなもの:

1)モニターの開始-適切な間隔モニターを使用します(ここでテストする間隔を使用することが重要です-単純なループはJSエンジンをしっかりとロックします)リクエストAとBの結果。

2)リクエストAを呼び出します。

3)リクエストBを呼び出します。

4)リクエストBが終了-コールバック関数は「B All Done!」値。

5)リクエストAの終了-コールバック関数は「A All Done!」を設定します;値。

6)モニターは両方の要求が完了したことを認識し、両方からのデータを使用する関数を呼び出します。

より簡単に言うと、これは「依存関係」です。 (複数の呼び出し)「モニター」に; (依存関係をチェックする機能)to" completion" (すべての準備が整ったときに実行するアクション)。

カプセル化を維持し、「少し」を減らすために、ネストされた関数としてコールバックと完了関数を作成できます。グローバルスコープ。

必要に応じて依存関係を拡張できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top