web-dev-qa-db-ja.com

Ajax競合状態

Ajaxの競合状態を処理するためのパターンまたは標準的な方法はありますか?次の例を見てください。 2つのテーブルがあります。テーブル1の行をクリックすると、DBからデータが削除され、テーブル2が更新されます(これにより、テーブル1のすべての行からクリックされた行を差し引いたものが表示されます)。

誰かが一連の行を連続してクリックする場所がある場合、タイミング/ラグの問題に対してすべてのクリックでテーブル2が更新されないというシナリオが発生する可能性があります。

これに取り組む良い方法は何でしょうか?私は可能なキューを使用することを考えていましたが、それは非同期で実行する目的を無効にします。ただし、UIがロックされないという利点はあります。

8
Ominus

考えてみれば、Ajaxコールバックメソッドのリストを作成できるでしょう。リストのスロットにコールバックを追加するメソッドで実際のAjaxコールバックをラップします。

このリストは、特定の順序でコールバックを待機し、最上位の要素(最初に呼び出すコールバック)が満たされた場合にのみ実行されます。

8
Greg

これは競合状態ではありません。

2つの非同期スレッド間の動作が未定義になると、競合状態が発生します。この問題は、最初の呼び出しからのコールバックをネストすることで解決できます

7
Sam

一般的に言えば、コールバックは非同期タスクを処理するための汎用的なツールであり、実際にコールバックはJavaScriptでAJAX要求を処理するメカニズムです。コールバックのコンテキストでは、クリックされた行への参照を持つこともできます。 (クロージャで閉じている場合)次の記事が役立ちます: jQuery deferred および jQueryでのDeferredsの使用

ユーザーが複数のボタンをクリックすることを許可されている場合、もう1つ心に留めておくべきことは、複数の要求が開始されることです。ただし、異なるブラウザーは異なる数のAJAX要求を同時に処理できます: concurrent-ajax-xmlhttprequest-requests )。これを克服するには、いくつかの基本的な要求キューを実装する必要があります。

6
rusev