如何在 addEventListener 中安排 removeEventListener?

How to schedule a removeEventListener inside an addEventListener?

我正在尝试定义一个可以触发自身删除的事件侦听器。

通常的方式是定义监听器,然后在调用addEventListener时引用。并在调用 removeEventListener 时使用相同的引用。由于 Purescript 是一种严格的语言,我似乎不能那样做,因为我无法引用我正在定义的侦听器。

import Web.Event.EventTarget
do
  listener <- eventListever (\event -> do
                 somethingUsefulWith event
                 _ <- removeEventListener evType listener' false target
                 pure unit
                 )
  addEventListener evType listener false target 

我希望 listener' 是 listener 但是,因为这是不可能的,我不知道是否有简单的解决方案。

目前的解决方案是使用 Ref.

import Effect.Ref as Ref

example = do
  listenerRef <- Ref.new Nothing
  listener <- eventListener \event -> do
    Ref.read listenerRef >>= traverse_ \listener -> do
      removeEventListener evType listener false target
  Ref.write (Just listener) listenerRef
  addEventListener evType listener false target