2016-05-23 20 views
10

我正在尝试在Elm 0.17 tutorial for HTTP中完成练习。如果获取gif失败,我想让用户知道为什么失败并显示错误消息。如何从Http.Error中获取错误消息?

我修改我的模型是:

type alias Model = 
    { topic : String 
    , gifUrl : String 
    , errorMessage : String 
    } 

,并获取失败的更新是:

FetchFail error -> 
    (Model model.topic model.gifUrl (errorMessage error), Cmd.none) 

当功能errorMessage如下:

errorMessage : Http.Error -> String 
errorMessage error = 
    case error of 
    Http.Timeout -> 
     "Timeout" 
    Http.NetworkError -> 
     "Network Error" 
    Http.UnexpectedPayload _ -> 
     "UnexpectedPayload" 
    Http.BadResponse _ _ -> 
     "BadResponse" 

上述功能对我来说似乎是不必要的锅炉板。有没有一种方法可以将Http.Error直接转换为字符串?

回答

12

您可以使用toString将任何内容转换为字符串。这会给你几乎相同的输出作为您的case语句:

toString Timeout == "Timeout" 
toString NetworkError == "NetworkError" 
toString (UnexpectedPayload "Error") == "UnexpectedPayload \"Error\"" 
toString (BadResponse 500 "Error") == "BadResponse 500 \"Error\"" 

只是toString更换呼叫errorMessage,你可以得到完全摆脱errorMessage

FetchFail error -> 
    (Model model.topic model.gifUrl (toString error), Cmd.none) 
+1

如果响应是'BadResponse 400“”“”{“errors”:[“缺少必需的参数q”]“”“',@Martimatix使用的样板将是必需的,否?本质上,响应将是'任何错误a'。 –

+2

如果你想省略参数并打印“BadResponse”,那么是的,你必须在case语句中明确地调用它,并且你可以有一个下划线全部的情况,然后默认为'toString'。 –

相关问题