0

次の状況を考慮してください。

バックエンドで多くの作業を処理するために、データをインターフェイスに送信し、結果のデータが返されるのを待ちます。したがって、ajax 呼び出しは完璧です。結果がどの順序で受信されるかわからないため、何かを表示するに特定の順序で結果が必要なため、送信されたすべてのタスクが正しく返された場合にのみ関数が呼び出されます。これは、送信されたタスクの数をカウントする単純な (縮小された、正確ではない) セマフォ変数を介して実行できます。

    var tasks = 0;

    do {
    // things to prepare
    tasks++;

    $.post("foo.php",data, function(data) {
    tasks--;
    foo(data); 
});

    }while(thereIsMore);

    foo(data) {

    // push data to array
    // sort the array

    if(tasks == 0)
     processResults(array);

    }

Javascript は、マルチタスクではなく、シングルタスクと呼ばれます。アレイとタスクカウンターへのアクセスで相互排除が発生することは決してないので、状況はありえないと言うのは本当に正しいですか? 私は非同期動作について少し混乱しています。レース状況が与えられる可能性があるシナリオを考えることができますか?

例(および私の理解は):

非常に短い時間枠で送受信される 3 つのタスク。したがって、すべての応答は一種のスケジューリングで処理されます。タスク 1 がチェックされ (タスク == 0 の場合)、偽でした。タスク 2 はタスクをチェックする前に 1 命令一時停止され、タスク 3 は成功ハンドラーとして実行されます。タスク 3 はタスクを減分し、その値は 0 です。タスク 3 は一時停止され、タスク 2 が再開されます。タスク 2 は if(tasks==0) をチェックし、そうです..ゼロです。処理を開始しますが、すべてのデータが配列内にあり、並べ替えられているわけではありません。

私はあなたの意見や知識に非常に興味があります. あなたの知識を共有してください:-)

4

3 に答える 3

1

一度に 1 つの ajax 応答関数のみが実行され、次の関数が実行される前に完了するまで実行されます。JavaScript 変数への同時アクセスについて心配する必要はありません。ブラウザーの Javascript は真にシングルスレッドです (Web Workers を除きますが、ここでは取り上げません)。

Javascript はイベント キューを使用します。ajax 呼び出しのような非同期操作が完了すると、エントリがイベント キューに入れられます。現在実行中の JavaScript がない場合、そのイベントはすぐに発生します (そして ajax コールバックが呼び出されます)。一部の JavaScript が現在実行されている場合は、そのまま実行され続けます。JavaScript が実行スレッドを終了すると、イベント キューで待機しているものがあるかどうかを確認します。存在する場合は、そのイベントを処理します。これは、マウス イベント、キーボード イベント、タイマー イベント、ajax 完了イベントなどが機能するのと同じ方法です。

次のイベントは、現在の実行スレッドが終了したときにのみ処理されます。

すべての ajax 呼び出しがいつ完了したかを知りたい場合は、サンプル コードのように、これまでに完了した ajax 呼び出しの数を数えることができます。各完了関数では、完了カウントを変更し、その値を比較して、すべてが完了したかどうかを確認します。数値がすべての操作が完了したことを示している場合は、最終操作を実行できます。それらがまだすべて完了していない場合は、データを保存して他に何もしません。これは、最後の成功ハンドラーがすべて完了したことを確認し、最終アクションを開始するためです。

于 2012-08-30T06:14:34.520 に答える
0

JQueryの「when()」メソッドをdeferredで使用することもできます。

...または、アンダースコアの「after()」関数。

これらのいずれも、多数の非同期要求がいつ返されたかを追跡するための非常に簡単な方法を提供します。

于 2012-08-30T06:31:06.240 に答える
0

このような競合状態は、javascript では決して発生しません。コードが実行されている場合、他の(非同期)コードが実行される前に完全に実行されるため、同時実行性の問題はありませ

詳細については、javascriptに同時実行制御ツールがない理由を参照してください。

于 2015-07-17T08:48:24.540 に答える