反射:根据行为延迟事件
Reflex: Delaying events based on a behavior
使用 reflex-frp 和 reflex-dom 我需要根据行为延迟事件。
我有:
delayEvent :: (MonadWidget t m, Reflex t)
=> Event t () -> Behavior t NominalDiffTime -> m (Event t ())
delayEvent e b = switch . current <$> widgetHold (return never) eDelsM
where
eDelsM = (`delay` e) <$> b <@ e -- Event t (m (Event t ()))
但是 return 事件永远不会触发。我在这里犯了一个简单的错误还是整个方法需要重新考虑?
显然,延迟永远不会触发,因为当 eDelsM
定义的小部件从事件 e0
激活时,它将等待下一个事件 e1
来创建一个延迟。但是,当事件的下一个实例 e1
触发时,eDelsM
小部件的一个新实例将变为活动状态并开始等待事件的下一个实例 e2
。解决方案是在 eDelsM
重新创建后立即触发新事件。
eDelsM = (\t -> getPostBuild >>= delay t) <$> b <@ e
使用 reflex-frp 和 reflex-dom 我需要根据行为延迟事件。 我有:
delayEvent :: (MonadWidget t m, Reflex t)
=> Event t () -> Behavior t NominalDiffTime -> m (Event t ())
delayEvent e b = switch . current <$> widgetHold (return never) eDelsM
where
eDelsM = (`delay` e) <$> b <@ e -- Event t (m (Event t ()))
但是 return 事件永远不会触发。我在这里犯了一个简单的错误还是整个方法需要重新考虑?
显然,延迟永远不会触发,因为当 eDelsM
定义的小部件从事件 e0
激活时,它将等待下一个事件 e1
来创建一个延迟。但是,当事件的下一个实例 e1
触发时,eDelsM
小部件的一个新实例将变为活动状态并开始等待事件的下一个实例 e2
。解决方案是在 eDelsM
重新创建后立即触发新事件。
eDelsM = (\t -> getPostBuild >>= delay t) <$> b <@ e