Ajax競合状態


8

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

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

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


AJAXとデータベース?この2つはどのようにして一緒になるのでしょうか。
2012年

いや、漠然としていた。データがajaxを介して送信/取得されるWebアプリで、具体的にはjQuery.get / postです。
Ominus

回答:


8

ちょっと考えてみてください。Ajaxコールバックメソッドのリストを作成できます。リストのスロットにコールバックを追加するメソッドで実際のAjaxコールバックをラップします。

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


1
プログラムでコールバックをネストすることは確実な解決策です。
サム

7

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

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


6
ネットワーク障害の可能性があるため、すべてのAJAX呼び出しが同じ速度で完了するわけではありません。ローカルネットワークでの開発中であっても、後のAJAX呼び出しが前の呼び出しの前に終了し、UIが誤って終了することもわかります。ネスト/キューイングのコールバックはそれを解決しますが、これ競合状態です。
イズカタ

1
@Izkataこれは不正解です。Javascriptはシングルスレッドで実行されるため、競合状態はありません。あなたが説明している状況は、2つの関数を同時に実行することに似ています。1つはファイルを開くためのもので、もう1つは開いたファイルの内容を読み取るためのものです。ファイルを開く関数、読み取り関数の前に実行する必要がありますが、同時に両方を実行すると、2番目の関数が最初に実行されることがあります。これは競合状態ではありません。適切に注文することができません。2017年のJavascriptの正解は、Promise.then()非同期コールバックを正しい順序で実行するために使用することです。
ダニエルT.

1
@Izkata競合状態ではなく、注文の問題です。リクエスト自体はブラウザによってネイティブに処理されますが、コールバックはJSスレッドで実行されます。競合状態は、同時に実行されている2つのスレッドが同じリソースを共有し、同時にリソースに対して読み取り/書き込みを行うと発生し、非決定的な出力が発生します。2つの同時AJAXリクエストがある場合、出力は確定的です。コールバックAまたはコールバックBの結果です。コールバックが呼び出される順序はわかりません。これは、ユーザーにと2つのボタンを提供するよりも違いはありません
ダニエルT.

1
ユーザーが最初にクリックするボタンがわからない。結果は、ボタンAのコールバックまたはボタンBのコールバックのいずれかになりますが、予測できない、非決定的な出力になることはありません。コールバックが呼び出される順序を制御する必要がある場合は、promiseを使用する必要があります。ただし、予測不可能なコールバック呼び出しのタイミングは、競合状態と同じではありません。
ダニエルT.17年

1
@Izkata競合状態の「予期しない結果」は、関数が非決定的であることを意味します。これは、「同時動作が予期しない結果を引き起こす可能性がある場合」という正確な理由により、JSでは発生しません。ここでのキーワードは同時です。AJAXリクエストは同時ですが、コールバックは同時ではありません。したがって、JSのコールバック関数の結果は、同時に実行されるのではなく、順次実行されるため、常に確定的です。この投稿は読んでいいです:blog.raananweber.com/2015/06/17/...
ダニエルT.

6

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

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


延期されたものについて話している唯一の人であるための+1。
Florian Margaine、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.