throwError в запросах компонента Halogen

Я борюсь с достижением следующей цели: у меня запросы 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 дело у меня нет под рукой!

Как можно справиться с таким требованием? Повторим - я хочу иметь возможность "отменить" оценку запроса моего компонента только тогда, когда выполненное действие обнаружит ошибку, но я хочу сделать это молча и обработать ее сверху.

2 ответа

Решение

У вас есть исключительный случай, когда текущий поток не может продолжаться, поэтому единственное, что нужно сделать, это выбросить исключение в Aff с помощью throwError :: forall eff a. Error -> Aff eff a,

Я пришел к выводу, что то, чего я хотел достичь, на самом деле нежелательно. Делать оценку запроса компонентов, не обращая внимания на тот факт, что произошла ошибка, не является чем-то хорошим (в свете того, что компонент может быть не заинтересован в полной обработке ошибки, но, по крайней мере, должен сделать что-то с его состоянием, чтобы не привести к поломке).

Поэтому мне действительно нужен какой-то помощник, который обрабатывает ошибку и возвращает простое указание того факта, что это произошло, чтобы компонент мог продолжить работу.

Другие вопросы по тегам