如何将Task Http.RawError Http.Response转换为Task String(Int,Int)

时间:2016-06-10 11:02:02

标签: elm

有类型和任务

type Msg
  = Fail String
  | Success (Int, Int)


makeRequest =
  let
    req =
      { verb = "GET"
      , headers = []
      , url = "http://localhost:8080"
      , body = empty
      }
  in
    Task.perform Fail Success <| send defaultSettings req

Fail构造函数的参数用于错误消息(仅"Error"),Succeess的第一个参数来自status的{​​{1}},第二个参数是来自Http.Response的{​​{1}}大小。

如何将value转换为Http.Response

我正在查看Task Http.RawError Http.ResponseTask String (Int, Int),我不明白如何将它们合并。我是在正确的方式吗?

1 个答案:

答案 0 :(得分:3)

是的,您可以使用Task.mapTask.mapError来获得结果。

首先,您需要一种方法来确定您的Http响应的大小。因为它可以是字符串或二进制blob,而blob是not yet supported,所以你可以定义一个这样的函数:

httpValueSize : Http.Value -> Int
httpValueSize val =
  case val of
    Text str -> String.length str
    Blob blob -> Debug.crash "Blobs have no implementation yet"

现在您可以在任务中使用映射函数,如下所示:

send defaultSettings req
  |> Task.map (\r -> (r.status, httpValueSize r.value))
  |> Task.mapError (always "Error")
  |> Task.perform Fail Success

您也可以在没有这样的映射函数的情况下执行此操作:

send defaultSettings req
  |> Task.perform (always <| Fail "Error") (\r -> Success (r.status, httpValueSize r.value))