Как избежать Expect msg с HTTP 2.0.0 в elm? - PullRequest
4 голосов
/ 03 марта 2020

В пакете elm Http 1.0.0 я мог бы отправить пользовательский запрос, например:

post : Endoint -> List (Http.Header) -> Http.Body -> Decoder a -> Http.Request a
post url headers body decoder =
    Http.request
        { method = "POST"
        , headers = headers
        , url = url
        , body = body
        , expect = Http.expectJson decoder
        , timeout = Nothing
        , withCredentials = False
        }

С помощью функции post, которую я написал выше, я могу просто вызвать ее, скажем, Decoder String и после отправки запроса Http строка ответа будет декодирована и возвращена. период. Нет необходимости создавать Msg как:

type Msg
    = GotText (Result Http.Error String)

И не нужно писать ветку в update для обработки Msg.

Однако, начиная с Http 2.0.0 аргумент expect имеет тип Expect msg, а не Expect a, что означает, что запись варианта Msg и дополнительной ветви для обновления теперь будет обязательной .

написание Api.elm файла, который делает запросы Http. Однако это означает, что теперь он должен будет иметь свой собственный тип Msg и функцию update для запуска после ответа на эти запросы.

Раньше я думал, что Home.elm должен отвечать только на сообщения от Home.Msg и Home.update не Api.Msg и Api.update. Я ошибаюсь? Должны ли Api.elm иметь свой собственный тип Msg и функцию update, которая изменяет другие страницы? Или есть лучший способ сделать это?

1 Ответ

1 голос
/ 21 марта 2020

Чтобы уточнить, что я объяснял в моем вопросе:

Пользовательский запрос в пакете Elm HTTP 2.0.0 выглядит следующим образом:

request : 
  { method : String
  , headers : List Header
  , url = String
  , body = Body
  , expect = Expect msg
  , timeout = Maybe Float
  , withCredentials = Maybe String
  }
  -> Cmd msg

Когда в Http 1.0.0 он выглядел как это:

request :
  { method : String
  , headers : List Header
  , url : String
  , body : Body
  , expect : Expect a
  , timeout : Maybe Float
  , withCredentials : Bool
  }
  -> Request a

Разница в том, что при использовании пользовательского запроса из HTTP 2.0.0 мне необходимо для передачи Msg для использования этого запроса.

Теперь моя проблема была: я использовал файл Api.elm. Каждый раз, когда мне нужно было выдать HTTP-запрос, я вызывал Api.request arg1 arg2..., скажем, Login.elm.

Поскольку функция request в Api.elm требовала типа Msg, для, в в этом случае запрос на вход в систему, я подумал, что мне нужно будет определить Msg из GotLogin в Api.elm и затем обработать, как GotLogin будет обновлять Login.elm, написав ветку update для GotLogin в Api.elm.

Однако я мог бы просто определить GotLogin Msg в Login.elm и передать его в Api.request. Поскольку я определил GotLogin в Login.elm, я бы поставил ветвь GotLogin в функции обновления Login.elm вместо Api.elm.

Это также относится к любому другому типу запроса. с любой другой страницы (Signup.elm, Home.elm, ...), что означает, что Api.elm не должно иметь своей собственной функции update, которая обновляет другие страницы.

Весь смысл Login.elm, имеющего собственную функцию update, состоит в том, что на него должны влиять только ветви его собственной функции update, а не ветви Api.elm.

.
...