卤素组件查询中的 throwError

throwError in Halogen component queries

我正在努力实现以下目标:我输入的 API 请求的方式 return 要么是期望的值,要么是状态代码未指示时的错误成功,或身份验证令牌无效时等:Either String r.

现在,当我 eval 查询我的组件时,我不想关心它。我只对快乐路径感兴趣(预期的错误,如无效登录尝试被认为是快乐的路径,只是想将意外的东西排除在外),并且应该统一和全局地处理错误(向总线发送一些通知)。

为此,我创建了转换器堆栈:

type App = ReaderT Env (ExceptT String (Aff AppEffects))

现在,要将它与 runUI 一起使用,我需要提供与 hoist 一起使用的自然转换(除非我遗漏了其他可能性):

runApp :: Env -> App ~> Aff AppEffects
runApp env app = do
  res <- runExceptT $ runReaderT app env
  case res of
    Right r -> pure unit
    Left err -> do Bus.write err env.bus
                   -- what to return here?

因为我们在这里使用~>,所以我们不得不保留return类型,但是对于Left的情况我手边没有!

如何应对这样的要求?重申一下 - 我只希望能够 'cancel' 在执行的操作遇到错误时评估我的组件查询,但我想静默地执行并从顶部处理它。

您遇到当前线程无法继续的异常情况,因此唯一要做的就是使用 throwError :: forall eff a. Error -> Aff eff a.

Aff 中抛出异常

我得出的结论是,我想要达到的结果实际上并不理想。让组件查询评估忽略错误发生的事实并不是什么好事(鉴于组件可能对完全处理错误不感兴趣,但至少对其状态做一些事情不会最终被破坏)。

因此,我真正需要的是处理错误的某种帮助程序,以及 return 错误发生事实的简单指示,以便该组件可以继续处理错误。