我想在将内容呈现到页面之前加载用户配置文件,但整个用户配置文件由多个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)
....
答案 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
只有在两项任务都成功后才会成功。如果任何任务失败,它将失败。