2013-04-07 258 views
3

我正在嘗試爲Yesod中的網站構建聊天功能,並且我希望它具有所有已連接用戶的列表。我想最好的方法是將用戶添加到連接上的用戶列表中,並在離開時將其刪除。看來,如果它保持連接打開的響應應該阻止,所以我寫了天真使用eventsource時檢測客戶端斷開連接

getReceiveR :: Handler() 
getReceiveR = do 
    App chan <- getYesod 
    req <- waiRequest 
    res <- lift $ eventSourceAppChan chan req 
    sendWaiResponse res 
    liftIO $ putStrLn "client disconnected" <-- Note this 

但是,這並不當然的工作,因爲sendWaiResponse短路。

有什麼方法可以檢測客戶端何時斷開連接?

編輯:我使用一個非常微小的修改版本this tutorial來測試這個概念。

+0

如果您曾經找到解決方案,您是否介意發佈它? – Fyrn 2018-01-08 05:15:42

回答

1

我不能確實運行代碼,但會工作嗎?

import Control.Monad.Trans.Resource 

getReceiveR :: Handler() 
getReceiveR = do 
    App chan <- getYesod 
    req <- waiRequest 
    res <- lift $ eventSourceAppChan chan req 
    register . liftIO $ putStrLn "client disconnected" 
    sendWaiResponse res 
+0

註冊函數來自哪裏?我無法在Google上找到它。 – 2013-04-07 04:19:25

+0

我想你是指在資源包中找到的那個,但是隻有在我停止該應用後才顯示該事件。它可能在腳手架工作方面有所不同,我會測試一下。 – 2013-04-07 04:26:00

+0

我知道有一個yesod版本,其中資源直到某個特定時間才能發佈,可能會跨越多個請求,但隨後發生了一個更改,應該在更新版本的yesod的每個請求結束時進行更改。不幸的是,我不能再比這個更具體。 – 2013-04-07 05:38:56

相關問題