2017-04-04 254 views
0

我已經成功地引發ELM一個簡單的HTTP請求和解碼JSON響應到ELM值 - [https://stackoverflow.com/questions/43139316/decode-nested-variable-length-json-in-elm]鏈HTTP請求和合並JSON響應

問題我面對NOW-

如何鏈接(併發首選)兩個http請求並將json合併到我的新(更新)模型中。注 - 請更新Commands.elm用於訪問遠程數據

套餐 - krisajenkins /對RemoteData http://package.elm-lang.org/packages/krisajenkins/remotedata/4.3.0/RemoteData

我的代碼

GitHub庫 - https://github.com/areai51/my-india-elm

以前工作守則 -

Models.elm

type alias Model = 
    { leaders : WebData (List Leader) 
    } 

initialModel : Model 
initialModel = 
    { leaders = RemoteData.Loading 
    } 

Main.elm

init : (Model, Cmd Msg) 
init = 
    (initialModel, fetchLeaders) 

Commands.elm

fetchLeaders : Cmd Msg 
fetchLeaders = 
    Http.get fetchLeadersUrl leadersDecoder 
     |> RemoteData.sendRequest 
     |> Cmd.map Msgs.OnFetchLeaders 


fetchLeadersUrl : String 
fetchLeadersUrl = 
    "https://data.gov.in/node/85987/datastore/export/json" 

Msgs.elm

type Msg 
    = OnFetchLeaders (WebData (List Leader)) 

Update.elm

update msg model = 
    case msg of 
     Msgs.OnFetchLeaders response -> 
      ({ model | leaders = response }, Cmd.none) 

更新的代碼 -(需要Commands.elm幫助)

Models.elm

type alias Model = 
    { lsLeaders : WebData (List Leader) 
    , rsLeaders : WebData (List Leader)   <------------- Updated Model 
    } 


initialModel : Model 
initialModel = 
    { lsLeaders = RemoteData.Loading 
    , rsLeaders = RemoteData.Loading 
    } 

Main.elm

init : (Model, Cmd Msg) 
init = 
    (initialModel, fetchLeaders) 

Commands.elm

fetchLeaders : Cmd Msg 
fetchLeaders =         <-------- How do I call both requests here ? And fire separate msgs 
    Http.get fetchLSLeadersUrl lsLeadersDecoder <----- There will be a different decoder named rsLeadersDecoder 
     |> RemoteData.sendRequest 
     |> Cmd.map Msgs.OnFetchLSLeaders 


fetchLSLeadersUrl : String 
fetchLSLeadersUrl = 
    "https://data.gov.in/node/85987/datastore/export/json" 


fetchRSLeadersUrl : String      <------------------ New data source 
fetchRSLeadersUrl = 
    "https://data.gov.in/node/982241/datastore/export/json" 

Msgs.elm

type Msg 
    = OnFetchLSLeaders (WebData (List Leader)) 
    | OnFetchRSLeaders (WebData (List Leader))   <-------- New message 

更新。榆樹

update msg model = 
    case msg of 
     Msgs.OnFetchLSLeaders response -> 
      ({ model | lsLeaders = response }, Cmd.none) 

     Msgs.OnFetchRSLeaders response ->     <--------- New handler 
      ({ model | rsLeaders = response }, Cmd.none) 

回答

3

仍然發射兩個併發請求的方式是使用Cmd.batch

init : (Model, Cmd Msg) 
init = 
    (initialModel, Cmd.batch [ fetchLSLeaders, fetchRSLeaders ]) 

誰也不能保證在其請求將返回第一,也不能保證他們都將是成功的。例如,一個可能失敗,另一個成功。

你提到你想要合併結果,但你沒有說合並是如何工作的,所以我只假設你想要在一個列表中追加領導者列表,這將是有用的到你的應用程序,如果你只需要處理一個單一的RemoteData值而不是多個。

您可以使用mapandMap將多個RemoteData值與自定義函數合併在一起。

mergeLeaders : WebData (List Leader) -> WebData (List Leader) -> WebData (List Leader) 
mergeLeaders a b = 
    RemoteData.map List.append a 
     |> RemoteData.andMap b 

請注意,我在那裏使用List.append。這實際上可以是任何需要兩個列表並將它們合併的函數。

如果你喜歡編程的應用性的風格,上面的也可被翻譯成以下綴版本:

import RemoteData.Infix exposing (..) 

mergeLeaders2 : WebData (List Leader) -> WebData (List Leader) -> WebData (List Leader) 
mergeLeaders2 a b = 
    List.append <$> a <*> b 

據對andMap文件(使用結果的元組,而不是一個附加列表中的例如):

只有當它的所有子級都成功時,最後的元組纔會成功。如果其任何子女仍在加載,它仍然處於加載狀態。如果有任何孩子失敗,則錯誤是最左邊的失敗值。