0

我正在努力实现以下目标:我输入的 API 请求的方式是它们返回所需的值,或者在状态代码未指示成功或身份验证令牌无效时返回错误等: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?

因为我们在~>这里使用,所以我们被迫保留返回类型,但是对于Left我手头没有它的情况!

如何解决这样的要求?重申一下 - 我只想在执行的操作遇到错误时“取消”我的组件查询的评估,但我想默默地做它并从顶部处理它。

4

2 回答 2

1

您有一个异常情况,当前线程无法继续,所以唯一要做的就是在Affusing中抛出异常throwError :: forall eff a. Error -> Aff eff a

于 2017-04-05T21:24:37.630 回答
0

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

因此,我真正需要的是某种帮助器来处理错误,并返回它发生的事实的简单指示,以便组件可以继续。

于 2017-04-06T05:16:22.550 回答