我在使用Socket.io接收消息時遇到了頁面導航之前的問題 - 通常是消息是由某個服務器端操作觸發的直接結果導航。Socket.io在瀏覽器導航到新頁面之前接收消息
我所看到的,現在看起來是這樣的:
- Socket.io連接
- 用戶觸發頁面導航(提交一個表單,刷新等)
- 服務器端邏輯向socket.io服務器發送請求,該請求立即將事件分派給仍然連接的客戶端
- 客戶端接收並確認請求(我確信有一些socket.io內置消息的確認,糾正我,如果我錯了),並會顯示通知用戶,但隨後...
- 的socket.io連接關閉原來的頁面
- 新的頁面加載和顯示
- Socket.io打開一個新的連接上,但沒有新的消息,因爲上次一個被收到並確認。
這實際上並不是一個錯誤,因爲我不認爲期望Socket.io在發生導航之前關閉連接是不合理的。但是,我不確定處理這個問題的最好方法是什麼。目前,我一次保持每個客戶端打開一個連接,並在新連接時關閉另一個連接。這種情況在這種情況下不會發生,因爲第一個在第二個連接之前已經關閉。我也可以保留所有客戶端的列表,但這也不能解決這個問題,因爲消息仍然會被第一個連接接收。
有人可以建議解決這個問題,以確保用戶總是看到通知的消息?
現在我正在實現我自己的用戶級會話管理。我知道每個連接的不同會話ID,正如我上面提到的,當新連接進行身份驗證時,我斷開了所有舊連接。聽起來像你的建議,'.emit'的回調將是最容易實現的,儘管我有點擔心回調將在頁面重新載入前被調用。這是否有可能延遲? – robbles
這樣看待:如果您是通過表單提交發送通知的,那麼在您想發送通知的時刻,舊的套接字連接已經消失,並且不會有新連接,直到在響應被髮送到瀏覽器之後。因此,您需要一種在Socket.io上方排列消息的方法;用戶會話是自然而然的事情。 – josh3736