[英]How to send AJAX request when user leaves (closes) the page?
嗨,我正在做一個數據庫驅動的游戲,其中有一個問題,如果用戶找到正確的答案,則該用戶有權更改該問題(即寫一個新問題)。
但這是一個重要的問題,我認為這稱為比賽條件。 問題是這樣的:
現在,我通過使用某種信號量並保持其timestamp
來解決此問題。 總結一下,它的工作原理如下:
['user_ip' = 'xx' , 'time'='yy' , 'locked'='true']
因此,當提交新問題時,僅當信號量未鎖定且當前時間比信號量日期大t
(15)秒時,應用程序才會接受它。
但這也有問題,提示用戶2
“您已經找到答案,但是有人在您之前找到了答案。如果他們在15秒內未提交新問題,則可以更改問題。”
因此,新獲勝者可能需要等待15秒,可能不必要。
因此,
我想用秒表(計時器)提示“優勝者”表格。 當達到零時,它將解鎖信號量,以便新的優勝者可以提交他們的問題。
但是此解決方案將存在以下問題:
如果獲勝者在時間計數器到達零之前關閉頁面,那么AJAX請求將永遠不會完成,並且信號量將無限期鎖定。
所以我必須確保已經調用了userLeave();
用戶關閉頁面時的功能。
Google建議onbeforeunload
和onunload
但人們也抱怨那些功能不起作用。 那么,如果用戶(獲獎者)離開頁面,是否有100%確保發送此AJAX呼叫的方式?
如果用戶(獲獎者)離開頁面,是否有100%確保發送此AJAX呼叫的方式?
您永遠不能 依靠客戶 100%做任何事情。 考慮一下網絡連接丟失,瀏覽器崩潰,不可用的功能(從與HTML5不兼容的瀏覽器到禁用的javascript),腳本錯誤,配置錯誤的代理,它們以意外的方式調用(或不調用)您的API或黑客故意這樣做的情況……
您可以期望客戶的唯一一件事就是他什么都不做-這稱為超時。
如果您希望信號燈在某個時間到期,則必須創建計時器服務器端。 如果您願意,您還可以中止計時器,並在客戶端發出不打算提交答案的通知時立即終止(無論哪種方式)。 如果要嘗試關閉頁面,可以使用unload
事件中的同步(A)JAX。
順便說一句:雖然我不了解您的游戲,但是如果您只接受兩個新問題,它會更容易,也可能會更舒適:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.