如何从Http.Error中获取错误消息?

Mar*_*tix 14 elm

我正在尝试在HTTPElm 0.17教程中完成练习.如果获取gif失败,我想让用户知道失败的原因并显示错误消息.

我修改了我的模型:

type alias Model =
  { topic : String
  , gifUrl : String
  , errorMessage : String
  }
Run Code Online (Sandbox Code Playgroud)

并且更新中的提取失败为:

FetchFail error ->
  (Model model.topic model.gifUrl (errorMessage error), Cmd.none)
Run Code Online (Sandbox Code Playgroud)

功能errorMessage如下:

errorMessage : Http.Error -> String
errorMessage error =
  case error of
    Http.Timeout ->
      "Timeout"
    Http.NetworkError  ->
      "Network Error"
    Http.UnexpectedPayload _ ->
      "UnexpectedPayload"
    Http.BadResponse _ _ ->
      "BadResponse"
Run Code Online (Sandbox Code Playgroud)

以上功能对我来说似乎是不必要的锅炉.有没有办法可以直接转换Http.Error成字符串?

Cha*_*ert 16

您可以使用将任何内容转换为字符串toString.这将为您提供与案例陈述几乎相同的输出:

toString Timeout == "Timeout"
toString NetworkError == "NetworkError"
toString (UnexpectedPayload "Error") == "UnexpectedPayload \"Error\"" 
toString (BadResponse 500 "Error") == "BadResponse 500 \"Error\""
Run Code Online (Sandbox Code Playgroud)

只需将呼叫替换为errorMessagewith toString即可errorMessage完全摆脱:

FetchFail error ->
  (Model model.topic model.gifUrl (toString error), Cmd.none)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想省略参数并只打印"BadResponse",那么是的,你必须在case语句中明确地调用它,你可以有一个下划线catch-all case然后默认为`toString`. (2认同)