次の状況を考慮してください。
バックエンドで多くの作業を処理するために、データをインターフェイスに送信し、結果のデータが返されるのを待ちます。したがって、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) をチェックし、そうです..ゼロです。処理を開始しますが、すべてのデータが配列内にあり、並べ替えられているわけではありません。
私はあなたの意見や知識に非常に興味があります. あなたの知識を共有してください:-)