簡體   English   中英

用戶離開(關閉)頁面時如何發送AJAX請求?

[英]How to send AJAX request when user leaves (closes) the page?

情況

嗨,我正在做一個數據庫驅動的游戲,其中有一個問題,如果用戶找到正確的答案,則該用戶有權更改該問題(即寫一個新問題)。

但這是一個重要的問題,我認為這稱為比賽條件。 問題是這樣的:

  • 用戶1找到答案
  • 提示用戶1輸入新問題
  • 在用戶1提交新問題之前,用戶2也找到新答案
  • 現在只能提交新問題了。 如果用戶2在用戶1之后提交問題,則用戶2的問題將覆蓋用戶1的問題。

現在,我通過使用某種信號量並保持其timestamp來解決此問題。 總結一下,它的工作原理如下:

  • 用戶1找到答案
  • 信號量被保存到數據庫中,例如['user_ip' = 'xx' , 'time'='yy' , 'locked'='true']
  • 信號量在t秒后過期
  • 僅當信號量過期時,才會接受新問題。

因此,當提交新問題時,僅當信號量鎖定且當前時間比信號量日期大t (15)秒時,應用程序才會接受它。

但這也有問題,提示用戶2

“您已經找到答案,但是有人在您之前找到了答案。如果他們在15秒內未提交新問題,則可以更改問題。”

因此,新獲勝者可能需要等待15秒,可能不必要。

因此,

我想做的事

我想用秒表(計時器)提示“優勝者”表格。 當達到零時,它將解鎖信號量,以便新的優勝者可以提交他們的問題。

但是此解決方案將存在以下問題:

如果獲勝者在時間計數器到達零之前關閉頁面,那么AJAX請求將永遠不會完成,並且信號量將無限期鎖定。

所以我必須確保已經調用了userLeave(); 用戶關閉頁面時的功能。

Google建議onbeforeunloadonunload但人們也抱怨那些功能不起作用。 那么,如果用戶(獲獎者)離開頁面,是否有100%確保發送此AJAX呼叫的方式?

如果用戶(獲獎者)離開頁面,是否有100%確保發送此AJAX呼叫的方式?

永遠不能 依靠客戶 100%做任何事情。 考慮一下網絡連接丟失,瀏覽器崩潰,不可用的功能(從與HTML5不兼容的瀏覽器到禁用的javascript),腳本錯誤,配置錯誤的代理,它們以意外的方式調用(或不調用)您的API或黑客故意這樣做的情況……

您可以期望客戶的唯一一件事就是他什么都不做-這稱為超時。

如果您希望信號燈在某個時間到期,則必須創建計時器服務器端。 如果您願意,您還可以中止計時器,並在客戶端發出不打算提交答案的通知時立即終止(無論哪種方式)。 如果要嘗試關閉頁面,可以使用unload事件中的同步(A)JAX。

順便說一句:雖然我不了解您的游戲,但是如果您只接受兩個新問題,它會更容易,也可能會更舒適:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM