2017-04-05 17 views
0

我很努力實現以下目標:我的API請求的輸入方式是返回一個期望的值,或者當狀態碼未指示成功時返回錯誤,或者身份驗證令牌已無效等:Either String rthrowError在鹵素組件查詢中

現在,我不想關心它,當我的組件查詢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情況下,我沒有它在眼前!

如何解決此類需求?重申 - 我只希望能夠在執行的操作遇到錯誤時'取消'對組件查詢的評估,但我想靜靜地執行並從頂部處理它。

回答

1

您有一個特殊情況,當前線程無法繼續,因此唯一要做的就是使用throwError :: forall eff a. Error -> Aff eff aAff中拋出異常。

0

我得出的結論是,我想實現的目標實際上是不可取的。讓構件查詢評估時忘記了發生錯誤的事實並沒有什麼好處(考慮到組件可能對完全處理錯誤並不感興趣,但至少在其狀態方面做了某些事情以防止發生錯誤)。

因此,我真正需要的是某種助手處理錯誤,並返回它發生的事實的簡單指示,以便組件可以繼續處理該錯誤。