Elm “在什么地方?”;Cmd Msg";交付的init函数的名称?

Elm “在什么地方?”;Cmd Msg";交付的init函数的名称?,elm,Elm,我很难理解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

我很难理解
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

问题是你的init没有做任何事情。如果您在
Cmd.none
上映射任何内容,您仍然有一个
Cmd.none

您真正想要发送的命令在更新函数中,因此只需将其直接升级到init,您就可以开始了:

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

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

好的,我不太理解
Cmd msg
模型。
Cmd
本质上不是一个未执行的IO/副作用动作(来自Haskell背景)。无论Cmd是如何构造的(通过Cmd.map或Task.perform),它都不应该交给Elm运行时执行吗?是的。但它不是一个未被释放的效果,而是运行时转化为效果的数据
init = 
    (LoginModel Login.CheckingAuth, Http.send AuthResult Api.login)