初始化时的 Elm Http 请求

Elm Http Request on Init

我对 Elm 很陌生,但正在慢慢熟悉它。我正在做一些简单的 Http 请求,这些请求在各个方面都很成功(我得到要显示的数据等)

目前我只能让我的 fetchData 触发 onClick,我想在 init 上初始化它,但我无法解决这个问题。

..这是我的 fetchData 函数:

fetchData : Cmd Msg
fetchData =
  Http.get repoInfoListDecoder "http://example/api"
    |> Task.mapError toString
    |> Task.perform ErrorOccurred DataFetched

当前在视图中由 onClick 事件触发:

.....
, button [ onClick FetchData ] [ text "Load Data" ]
.....

我想避免通过按钮请求数据,而是希望在应用程序初始化时加载数据。这是我的初始化:

init =
  let
    model =
      { message = "Welcome", repos = [] }
  in
    model ! []

还有我的更新(有点被剥夺了……例如):

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    NoOp ->
      model ! []
    ...........
    FetchData ->
      { model | message="hi" } ! [fetchData]
    ...........
    DataFetched repos ->
      { model | repos = repos, message = "The data has been fetched!" } ! []

这有意义吗?我只是在加载应用程序时难以初始化 fetchData,因此我可以显示我的数据而无需点击按钮来获取它。

提前致谢!

这里是 Html.App.program 的类型签名。 init 接受 Cmd,您只需在此处输入命令即可。

program
    :  { init : (model, Cmd msg), update : msg -> model -> (model, Cmd msg), subscriptions : model -> Sub msg, view : model -> Html msg }
    -> Program Never

当您使用 Html.program 时,您的 init 函数 returns 模型和要执行的命令的初始数据。

命令是副作用,就像 HTTP 请求一样。

尝试更改 init 使其立即运行命令:

init: (Model, Cmd Msg)
init =
  let
    model =
      { message = "Welcome", repos = [] }
  in
    model ! [ fetchData ]

另一种方法是使用Task,目前还没有提到。你可以试试

initWithFlags : Flags -> ( Model, Cmd Msg)
initWithFlags flags =
    ( { user = flags.user }, (Task.perform fetchData) )