2016-06-03 3 views
1

Мне интересно, смогу ли я получить некоторую помощь при повторении списка групп, сделав запрос POST для каждой группы, чтобы создать «комнату», итерацию пользователей для каждой группы и создание запрос POST, чтобы назначить их в эту конкретную комнату.Elm: список Iterate, выполняющий несколько HTTP-запросов

У меня есть следующая модель.

model = { 
    groups = [ 
    { 
     title = "Foo" 
     , users = [ 
     { name = "Joe" } 
     , { name = "Mary" } 
     ] 
    }, 
    { 
     title = "Bar" 
     , users = [ 
     { name = "Jill" } 
     , { name = "Jack" } 
     ] 
    } 
    ] 
} 

Желаемый результат состоит в том, что комната Foo была создана и Джо и Мэри были назначены, и бар был создан и Джилл и Джек были назначены.

Вид на данный момент будет простой кнопкой, которая вызывает действие.

div [] 
    [ button [ onClick InviteUsersToRoom ] [ text "Invite users to room" ] ] 

я создал 2 POST запросы:

  1. createRoom: возьмите title, создать комнату с помощью title и возвращающие room_id

  2. AddUser: принять a room_id и name пользователя, добавьте пользователей в комнату и верните статус ok

пример:

-- create a room for each group 
-- passing in `title` as the room name 
-- which will return the room id from `decodeCreateRoomResponse` 

createRoom : String -> String -> Cmd Msg 
createRoom title = 
    Task.perform 
    CreateRoomsFail 
    CreateRoomsSuccess 
    (Http.post 
     decodeCreateRoomResponse 
     ("https://some_api?room=" ++ title) 
     Http.empty 
    ) 


decodeCreateRoomResponse : Json.Decoder String 
decodeCreateRoomResponse = 
    Json.at ["room", "id"] Json.string 


-- add a user to a room using a `room_id` and the user's name 
-- returns a bool from `decodeAddUserResponse` 

addUser : String -> String -> Cmd Msg 
addUser room_id user = 
    Task.perform 
    AddUserFail 
    AddUserSuccess 
    (Http.post 
     decodeCreateChannelResponse 
     ("https://some_api?room=" ++ room_id ++ "&user=" ++ user) 
     Http.empty 
    ) 


decodeAddUserResponse : Json.Decoder String 
decodeAddUserResponse = 
    Json.at ["ok"] Json.bool 

мне интересно, как вы бы идти о шить это вверх в целом, так что OnClick:

  1. итерация каждая группа
  2. сделать POST для создания комнаты
  3. взять room_id из ответа и повторить попытку пользователя
  4. POST на room_id и пользователи называют

Любая помощь приветствуется.

ответ

1

У вас есть несколько разрозненных ошибок, которые я не буду указывать явным образом, потому что компилятор вам поможет, но вы готовы к хорошему старту. У вас уже есть обработка Http Cmd s, поэтому вам просто нужно связать вещи с помощью вашей функции update.

Давайте определим вашу модель явно (вы можете уже делать это, но это не в вашем примере):

type alias User = 
    { name : String } 

type alias Group = 
    { title : String 
    , users : List User 
    } 

type alias Model = 
    { groups : List Group } 

Основа своих функций, вот как я интерпретировать ваш Msg типа, с одной небольшое изменение, которое должно добавить список пользователей в качестве параметра в CreateRoomsSuccess.

type Msg 
    = InviteUsersToRoom 
    | CreateRoomsFail Http.Error 
    | CreateRoomsSuccess (List User) String 
    | AddUserFail Http.Error 
    | AddUserSuccess Bool 

Теперь мы можем настроить createRoom, чтобы пройти по списку пользователей создавать. Обратите внимание, что в настоящее время это не создает пользователей.Он использует currying для создания частично прикладной функции, так что, когда случай CreateRoomsSuccess обрабатывается в функции update, у него уже есть список пользователей, которые необходимо создать (вместо того, чтобы искать их в списке model):

createRoom : Group -> Cmd Msg 
createRoom group = 
    Task.perform 
    CreateRoomsFail 
    (CreateRoomsSuccess group.users) 
    (Http.post 
     decodeCreateRoomResponse 
     ("https://some_api?room=" ++ group.title) 
     Http.empty 
    ) 

чтобы создать список номеров, вы просто отобразить список групп в список Cmd с, которые выполняют пост. Это произойдет при нажатии кнопки:

case action of 
    InviteUsersToRoom -> 
    model ! List.map createRoom model.groups 
    ... 

При возникновении ошибок вам придется внедрять случаи обновления. Затем, мы должны обработать сообщение CreateRoomsSuccess. Здесь вам нужно будет найти список пользователей для группы. Опять же, вы будете карту через функцию, которую вы уже создали, обрабатывающий Http задачу:

case action of 
    ... 
    CreateRoomsSuccess users roomID -> 
    model ! List.map (addUser roomID << .name) users 
    ... 

Вы должны обращаться с AddUserFail и AddUserSuccess случаев, но приведенные выше примеры должны помочь вам понять, как разместить несколько сообщений и действовать соответственно на основе успеха или неудачи каждого из них.

+0

Большое спасибо за подробный ответ. Я всегда так много узнаю из ваших ответов! –

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