elm - 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 ()))
解决方案
问题是你的 init 它什么也没做。如果你在 a 上映射任何东西,Cmd.none
你仍然有一个Cmd.none
.
您真正想要发送的命令在您的更新功能中,因此只需将其直接提升到 init 中,您应该很高兴:
init =
(LoginModel Login.CheckingAuth, Http.send AuthResult Api.login)
您的第二个代码示例中确实有一个命令,因此它会立即返回并传递给更新函数,但正如您所看到的,这不是实现目标的最简单方法。