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

How to perform multiple Http requests (Tasks) in bulk in Elm lang

我想在将某些内容呈现到页面之前加载用户配置文件,但整个用户配置文件由多个 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 请求并且 return 只是一个完整的值?

像这样

init = 
    (initialModel, loadUserProfile userId LoadUserProfileFail LoadUserProfileSuccess)

....

您可以使用 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... 消息。在 Elm 0.18 中,需要单独的 Fail 和 Succeed MsgsTask.attempt 期望 Result Error Msg 类型解决,因此 LoadUserProfile 定义如下:

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

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