2016-09-08 2 views
4

Я хочу загрузить профиль пользователя перед тем, как сделать что-то на странице, но весь профиль пользователя состоит из разных частей, которые загружаются несколькими HTTP-запросами.Как выполнить несколько запросов Http (Задачи) навалом в Elm lang

До сих пор я загружаю профиль пользователя в последовательности (один за другим)

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) 

.... 

ответ

7

Вы можете добиться этого с помощью Task.map2:

Edit: Обновлен 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, потребность в отдельную неудачу и Succeed Msgs адресуется Task.attempt ожидает Result Error Msg типа, так что LoadUserProfile определяются следующим образом:

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

map2 будет успешным только один раз обе задачи успеха. Он потерпит неудачу, если какая-либо из задач завершится неудачно.

+3

Стоит отметить, что эти сетевые запросы будут выполняться последовательно; они не будут одновременно. –

+0

Есть ли способ сделать это, что _is_ параллельно? – mLuby

+1

Используйте 'Cmd.batch' для запуска задач одновременно. Обратите внимание, что они не будут иметь никакого отношения друг к другу, поэтому любые зависимости между результатами будут обрабатываться вами в вашей функции 'update'. –

Смежные вопросы