2013-04-07 1 views
3

Yesod의 웹 사이트에 대한 채팅 기능을 구축하려고하는데 거기에있는 모든 연결된 사용자의 목록을 원합니다. 그 일을하는 가장 좋은 방법은 연결에서 사용자 목록에 사람을 추가하고 떠나면 제거하는 것입니다. 때문에 sendWaiResponse 단락, 연결 개방 유지하는 경우 응답이 차단해야한다는 것, 그래서 나는 순진하게도 이벤트 소스를 사용할 때 클라이언트 연결을 감지하십시오.

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

을 썼다 그러나 그것은 물론 작동하지 않았다.

클라이언트가 연결을 끊을 때 어떤 방법으로 감지 할 수 있습니까?

편집 : 개념을 테스트하기 위해 매우 슬림하게 수정 된 this tutorial 버전을 사용하고 있습니다.

+0

해결책을 찾은 경우 게시 하시겠습니까? – Fyrn

답변

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에서 찾을 수 없습니다. –

+0

리소스 패키지에있는 패키지를 언급 ​​한 것 같습니다.하지만 앱을 중지 한 후에 만 ​​이벤트가 표시되었습니다. 그것은 스캐 폴딩 된 사이트에서 다르게 작동 할 수도 있습니다, 나는 그것을 테스트 할 것입니다. –

+0

예를 들어, 여러 요청에 걸쳐있을 수있는 특정 시간까지 자원이 릴리스되지 않았지만 새로운 버전의 yesod에서 모든 요청이 끝날 때 릴리스되도록 변경 한 yesod 버전이 있음을 알고 있습니다. 불행히도 나는 그것보다 더 구체적 일 수는 없다. –

관련 문제