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

ond*_*rej 7 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
  ...
  ]
Run Code Online (Sandbox Code Playgroud)

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

像这样的东西

init = 
    (initialModel, loadUserProfile userId LoadUserProfileFail LoadUserProfileSuccess)

....
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以删除单个LoadUserName ...和LoadCompanyInfo ... Msgs.在Elm 0.18中,需要单独的Fail和Succeed Msgs通过Task.attempt期望Result Error Msg类型来解决,因此LoadUserProfile定义如下:

type Msg
    = ...
    | LoadUserProfile (Result Http.Error UserProfile)
Run Code Online (Sandbox Code Playgroud)

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

  • 值得注意的是,这些网络请求将按顺序运行; 他们_不会同时发生. (5认同)