首页 > 解决方案 > init 函数的“Cmd Msg”是在什么时候传递的?

问题描述

我很难理解init函数的行为。CheckingAuth我正在尝试构建一个登录页面,该页面在页面加载时进入阶段。这是我的init功能:

init : (Model, Cmd Msg)
init = (LoginModel Login.CheckingAuth, Cmd.map (\_ -> LoginMsg Login.CheckAuth) Cmd.none)

Login.Page这是我的模块中的一段代码:

type Model = CheckingAuth | Display String | Redirecting String
type Msg = CheckAuth | AuthResult (Result Http.Error (Either String (Entity User))) | RedirectTo String

update : Msg -> Model -> (Model, Cmd Msg)
update msg model = 
    case (Debug.log "MSG DELIVERED" msg) of
        CheckAuth -> (CheckingAuth, Debug.log "making API request" <| Http.send AuthResult Api.login)
        -- other cases come here

我尝试了很多东西,但无法CheckAuth在应用程序启动时传递消息。

编辑:我终于得到了使用以下代码片段的东西,但我不知道为什么Cmd Msg构造的Task.perform作品,但构造的作品Cmd.map没有:

init = (LoginModel Login.CheckingAuth, Task.perform (always <| LoginMsg Login.CheckAuth) (Task.succeed ()))

标签: elm

解决方案


问题是你的 init 它什么也没做。如果你在 a 上映射任何东西,Cmd.none你仍然有一个Cmd.none.

您真正想要发送的命令在您的更新功能中,因此只需将其直接提升到 init 中,您应该很高兴:

init = 
    (LoginModel Login.CheckingAuth, Http.send AuthResult Api.login)

您的第二个代码示例中确实有一个命令,因此它会立即返回并传递给更新函数,但正如您所看到的,这不是实现目标的最简单方法。


推荐阅读