如何在Elm lang中批量执行多个Http请求(任务)

时间:2016-09-08 13:36:21

标签: http task elm

我想在将内容呈现到页面之前加载用户配置文件,但整个用户配置文件由多个HTTP请求加载的不同部分组成。

到目前为止,我按顺序(逐个)加载用户个人资料

type alias CompanyInfo = 
  { name: String
  , address: ...
  , phone: String
  , ...
  }

type alias UserProfile = 
  { userName: String
  , companyInfo: CompanyInfo
  , ... 
  }

Cmd.batch
  [ loadUserName userId LoadUserNameFail LoadUserNameSuccess
  , loadCompanyInfo userId LoadCompanyInfoFail LoadCompanyInfoSuccess
  ...
  ]

但那不是很有效。有一种简单的方法如何执行一堆Http请求并返回一个完整的值?

像这样的东西

init = 
    (initialModel, loadUserProfile userId LoadUserProfileFail LoadUserProfileSuccess)

....

1 个答案:

答案 0 :(得分:11)

您可以使用Task.map2

实现此目的

编辑:已更新为Elm 0.18

Task.attempt LoadUserProfile <|
    Task.map2 (\userName companyInfo -> { userName = userName, companyInfo = companyInfo })
        (Http.get userNameGetUrl userDecoder |> Http.toTask)
        (Http.get companyInfoGetUrl companyInfoDecoder |> Http.toTask)

然后您可以删除单个LoadUserName ...和LoadCompanyInfo ... Msgs。在Elm 0.18中,Msgs需要Task.attempt类型来解决对单独的失败和成功Result Error Msg的需求,因此LoadUserProfile的定义如下:

type Msg
    = ...
    | LoadUserProfile (Result Http.Error UserProfile)

map2只有在两项任务都成功后才会成功。如果任何任务失败,它将失败。