2013-04-07 210 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

相关问题