【发布时间】:2017-03-31 08:14:03
【问题描述】:
我有一个 Yesod 应用程序,在我的数据库中有一个带有标志的表,该表具有三种可能的状态(ToUse、Using、Used),默认为 ToUse。
当用户单击按钮时,数据库中的标志更改为 Using,其想法是,如果 10 分钟后标志未更改为 Used(使另一个用户使用另一个按钮的操作),则标志返回 ToUSe,问题是搜索我找不到一种方法来延迟编辑我的数据库的操作,我不确定在 Yesod 中是否可能
搜索我找到timeout 库,但如果我理解正确,该库只会停止程序的执行,不要延迟他的启动
我尝试使用Control.Concurrent,但出现以下错误
testTimeOut = do
c1 <- atomically $ newTQueue
C.forkIO $ do
C.threadDelay (2 * 1000000)
id <- runDB $ insert $ SubForm "ToUse" 10
atomically $ do
writeTQueue c1 "result 1"
无法匹配预期的类型“IO t0” 实际类型为“HandlerT site0 IO (Key SubForm)”
编辑
此代码适用于我
getFooR :: Handler RepHtml
getFooR = do
runInnerHandler <- handlerToIO
liftIO $ forkIO $ runInnerHandler $ do
Code here runs inside GHandler but on a new thread.
This is the inner GHandler.
...
Code here runs inside the request's control flow.
This is the outer GHandler.
...
【问题讨论】:
-
timeout?从字面上看,“Haskell timeout”是谷歌上的第一个热门话题。如果你没有做出最小的努力,你会感到羞耻;如果你这样做了,你应该在你的问题中说明为什么这不起作用。
-
FWIW,您可能希望使用来自
lifted-base的timeout以便在yesod 处理程序中使用它:hackage.haskell.org/package/lifted-base-0.2.3.8/docs/…。 -
@DanielWagner 如果我理解有关超时函数的文档,他们不会延迟,如果函数超过 n 毫秒,他们只会停止执行;
-
@oriaj 好的。您是否在 Google 上搜索过“Haskell 延迟”...?
-
@DanielWagner 是并找到
Control.Concurrent我尝试制作和植入但失败,因为返回必须是和 IO,我用我的代码编辑我的问题