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