Elm:调用 Http.post 时,如何从“expect”向 Msg 发送额外的参数?

vio*_*let 1 http elm

我第一次尝试在 Elm 中创建一个应用程序。我需要使用 Http.post 与服务器应用程序交互。

\n

我有这样的消息类型:

\n
type Msg =\n    \xe2\x80\xa6\n    | Send (String, String)\n    | Recv (String, String)\n
Run Code Online (Sandbox Code Playgroud)\n

更新函数是这样的:

\n
update : Msg -> Model -> (Model, Cmd Msg)\nupdate msg model =\n    case msg of\n        \xe2\x80\xa6\n        Send (name, data) ->\n            (newModel, Http.post\n                { url = url\n                , body = Http.multipartBody [Http.stringPart "data" data]\n                , expect = Http.expectString (Recv name)\n                })\n        Recv (name, data) -> \xe2\x80\xa6 -- process data\n\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我运行它时,它会在 Http.post 中产生类型不匹配错误。\n那么如何将 name 和 newData 同时传递给 Msg“Recv”?

\n

Jak*_*mpl 5

您的类型构造函数Recv需要一个参数,它是一个字符串元组。所以本质上Recv : ( String, String ) -> Msg

因此,当您调用Recv name, where时name : String,您将收到类型错误。

这里有两种解决方案:

  1. 你改变了的定义Recv

    | Recv String String
    
    Run Code Online (Sandbox Code Playgroud)

    现在这意味着您可以部分应用Recv构造函数并返回一个函数String -> Msg,这正是我们Http.expectString想要的。

  2. 您更改期望调用以获得正确的形状:

    , expect = Http.expectString (\body -> Recv ( name, body ))
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,您明确地创建了所需的功能Http.expectString