Elmish:Program.withErrorHandler是否处理Cmd.ofAsync的错误情况?

时间:2019-04-30 22:23:17

标签: f# fable-f# elmish

我正在尝试在Elmish(寓言)应用程序中的每个可能位置捕获并记录错误。

如果我已经使用Program.withErrorHandler添加了日志记录处理程序,是否还需要向每个cmd.ofAsync调用的Error案例中添加日志记录代码?

StackOverflow说要显示一些代码,所以这是我的状态更新功能:

| ZipCodeChanged (ZipCode s) ->
    let newZip, cmd = 
        if s |> ZipCode.looksLikeAZipCode then
            let cmd = Cmd.ofAsync api.LookupZipCode (ZipCode s) LookupZipCodeResponse LookupZipCodeError 
            InvalidInput (ZipCode s, [ValidationError "Validating ZIP Code ..."]), cmd
        else
            InvalidInput (ZipCode s, [ValidationError "Please inputs a 5 digit numeric ZIP Code."]), Cmd.none

    { model with ZipCode = newZip }, cmd
| LookupZipCodeResponse (posOpt) ->
    (... eliminated for brevity ...)
| LookupZipCodeError e ->
    { model with ZipCode = InvalidInput (ZipCode "", [ValidationError (sprintf "Error validating ZIPCode: %s" e.Message)]) }, Cmd.none

此代码一直将ZipCode视为“ InvalidInput”,并在用户友好的验证消息中一直有效,直到成功接收到LookupZipCodeResponse。

但是,如果对后端API的调用失败,如果我已经提供了记录我提供给Program.withErrorHandler的功能的记录,是否需要在LookupZipCodeError中添加自己的记录代码?

1 个答案:

答案 0 :(得分:1)

您确实必须向LookupZipCodeError添加日志记录代码:Program.withErrorHandler处理update中的未捕获错误,而Cmd.ofAsync实际上是捕获的呼叫的错误情况,并将其包装在LookupZipCodeError消息中。