特定の Ajax イベントが非同期的にトリガーされる Web ページがあります。この Ajax セクションは、1 回または複数回呼び出すことができます。このイベントがトリガーされる回数やタイミングを制御することはできません。
また、その Ajax セクションには、クリティカル セクションとして実行する必要がある特定のコードがあります。つまり、実行中は、そのコードの他のコピーを実行してはなりません。
擬似コードは次のとおりです。
- JavaScript または jQuery コードを実行する
- Ajax であるクリティカル セクションを入力します (特定のプロセスが応答コールバックを待機している場合、このプロセスが完了するまで、このセクションには再度入力しないでください)。
- より多くの JavaScript または jQuery コードを実行する
私の質問は、上記の方法でステップ 2 を実行するにはどうすればよいですか? JavaScript または jQuery を使用して相互排除セクションを作成/保証するにはどうすればよいですか?
理論 (セマフォ、ロックなど) は理解していますが、JavaScript や jQuery を使用してソリューションを実装することはできませんでした。
編集
クリティカル セクションに入るためにブール変数を提案している場合、これは機能しません。以下の行でその理由を説明します。
クリティカル セクションのコードは次のようになります (ブール変数の提案を使用)。
load_data_from_database = function () {
// Load data from the database. Only load data if we almost reach the end of the page
if ( jQuery(window).scrollTop() >= jQuery(document).height() - jQuery(window).height() - 300) {
// Enter critical section
if (window.lock == false) {
// Lock the critical section
window.lock = true;
// Make Ajax call
jQuery.ajax({
type: 'post',
dataType: 'json',
url: path/to/script.php,
data: {
action: 'action_load_posts'
},
success: function (response) {
// First do some stuff when we get a response
// Then we unlock the critical section
window.lock = false;
}
});
// End of critical section
}
}
};
// The jQuery ready function (start code here)
jQuery(document).ready(function() {
var window.lock = false; // This is a global lock variable
jQuery(window).on('scroll', load_data_from_database);
});
これは、ブール変数を使用して提案されたロック セクションのコードです。これは、以下に示すようには機能しません。
ユーザーが下にスクロールします (関連付けに基づいて、
jQuery(window).on('scroll', load_data_from_database);
複数のスクロール イベントがトリガーされます。2 つのスクロール イベントがほぼ同時にトリガーされたとします。
load_data_from_database
どちらも関数を呼び出しますwindow.lock
最初のイベントは、偽かどうかをチェックします(答えは真なので、ステートメントが正しい場合)window.lock
2 番目のイベントは、偽かどうかをチェックします(答えは真なので、ステートメントが正しい場合)。最初のイベントが if ステートメントに入る
2 番目のイベントが if ステートメントに入る
最初のステートメントはtrue
window.lock
に設定されます2 番目のステートメントはtrue
window.lock
に設定されます最初のステートメントは Ajax クリティカル セクションを実行します
2 番目のステートメントは、Ajax クリティカル セクションを実行します。
どちらもコードを終了します
お気づきのように、両方のイベントがほぼ同時にトリガーされ、両方ともクリティカル セクションに入ります。したがって、ロックはできません。