2016-06-10 42 views
1

有一個類型和任務如何工作Http.RawError Http.Response轉換成任務字符串(INT,INT)

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參數是從statusHttp.Response,第二個是用於從Http.Responsevalue大小。

如何轉換Task Http.RawError Http.ResponseTask String (Int, Int)

我在看Task.mapTsk.mapError,我不明白如何將它們組合。我的方式是否正確?

回答

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)) 
+0

太謝謝你了! – ztsu