如何在 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 Msgs
由 Task.attempt
期望 Result Error Msg
类型解决,因此 LoadUserProfile
定义如下:
type Msg
= ...
| LoadUserProfile (Result Http.Error UserProfile)
map2
只有在两个任务都成功后才会成功。如果任何任务失败,它将失败。
我想在将某些内容呈现到页面之前加载用户配置文件,但整个用户配置文件由多个 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 Msgs
由 Task.attempt
期望 Result Error Msg
类型解决,因此 LoadUserProfile
定义如下:
type Msg
= ...
| LoadUserProfile (Result Http.Error UserProfile)
map2
只有在两个任务都成功后才会成功。如果任何任务失败,它将失败。