3

我正在尝试为 Yesod 中的一个网站构建一个聊天功能,我希望它有一个所有已连接用户的列表。我想最好的方法是将该人添加到连接上的用户列表中,并在他们离开时将其删除。如果保持连接打开,似乎响应应该阻塞,所以我天真地写了

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

但它当然不起作用,因为 sendWaiResponse 短路了。

有什么方法可以检测客户端何时断开连接?

编辑:我正在使用本教程的一个非常修改的版本来测试这个概念。

4

1 回答 1

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
于 2013-04-07T04:14:46.437 回答