1

状況

こんにちは、私はデータベース駆動型のゲームを作成しています。このゲームでは質問があり、正しい答えを見つけた場合、ユーザーは質問を変更する (つまり、新しい質問を作成する) 権利を取得します。

しかし、これには重要な問題があります。競合状態と呼ばれるものだと思います。問題はこれです:

  • ユーザー 1 が答えを見つける
  • ユーザー 1 は、新しい質問を入力するように求められます
  • ユーザー 1 が新しい質問を送信する前に、ユーザー 2 も新しい回答を見つける
  • 新しい質問を提出するのは運だけです。ユーザー 2 がユーザー 1 の後に質問を送信すると、ユーザー 2 の質問がユーザー 1 の質問を上書きします。

現在、ある種のセマフォを使用してこの問題を修正しましたtimestamp。要約すると、次のように機能します。

  • ユーザー 1 が答えを見つける
  • セマフォは次のようにデータベースに保存されます['user_ip' = 'x.x' , 'time'='y.y' , 'locked'='true']
  • セマフォは t 秒後に期限切れになります
  • セマフォの有効期限が切れている場合にのみ、新しい質問が受け入れられます。

そのため、新しい質問が送信されると、セマフォがロックされておらずt、現在の時刻がセマフォの日付より (15) 秒大きい場合にのみ、アプリケーションはそれを受け入れます。

しかし、これにも問題があり、ユーザー 2 にプロンプ​​トが表示されます

「あなたは答えを見つけましたが、あなたの前に誰かが見つけました。15 秒以内に新しい質問が提出されない場合は、質問を変更できます。」

したがって、新しい勝者は 15 秒待たなければなりませんが、おそらく不必要です。

したがって、

私がしたいこと

「勝者」にストップウォッチ(タイムカウンター)でフォームを促したい。ゼロになると、セマフォのロックが解除され、新しい勝者が質問を送信できるようになります。

しかし、このソリューションには次の問題があります。

勝者がタイム カウンターがゼロになる前にページを閉じた場合、AJAX 要求は実行されず、セマフォは無期限にロックされます。

userLeave();そのため、ユーザーがページを閉じた場合に関数を呼び出したことを確認する必要があります。

Googleは提案onbeforeunloadしていますonunloadが、人々はそれらの機能が機能していないことに不満を持っています。ユーザー (勝者) がページを離れた場合に、この AJAX 呼び出しを送信する 100% 確実な方法はありますか?

4

1 に答える 1

2

ユーザー (勝者) がページを離れた場合に、この AJAX 呼び出しを送信する 100% 確実な方法はありますか?

クライアントが何かを 100% 行うことに決して依存することはできません。ネットワーク接続の切断、ブラウザーのクラッシュ、利用できない機能 (HTML5 と互換性のないブラウザーから無効化された JavaScript まで)、スクリプト エラー、予期しない方法で API を呼び出す (またはしない) 誤って構成されたエージェント、またはハッカーが意図的に同じことを行うことを考えてみてください…</ p>

クライアントに期待できる唯一のことは、クライアントが何もしないことです。これをタイムアウトと呼びます。

セマフォを特定の時間に期限切れにする場合は、サーバー側でタイマーを作成する必要があります。必要に応じて、クライアントが応答を送信しないことを通知したときに、タイマーを中止し、すぐに期限切れにすることもできます (手段は問わない)。ページを閉じるのをキャッチしたい場合は、unloadイベントから同期 (A)JAX を使用できます。

ところで: 私はあなたのゲームを知りませんが、単に両方の新しい質問を受け入れていただければ、より簡単でおそらくより快適になるでしょう :-)

于 2013-09-17T01:39:58.627 に答える