Elm:如何在调用 Http.post 时向 "expect" 的 Msg 发送额外的参数?
Elm: How can I send extra params to a Msg from "expect" when calling Http.post?
第一次尝试用Elm做APP。我需要使用 Http.post.
与服务器应用程序交互
我有这样的消息类型:
type Msg =
…
| Send (String, String)
| Recv (String, String)
更新函数是这样的:
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
…
Send (name, data) ->
(newModel, Http.post
{ url = url
, body = Http.multipartBody [Http.stringPart "data" data]
, expect = Http.expectString (Recv name)
})
Recv (name, data) -> … -- process data
但是当我 运行 这样做时,它会在 Http.post 中产生类型不匹配错误。
那么如何同时将 name 和 newData 传递给 Msg "Recv"?
您的类型构造函数 Recv
需要一个单独的参数,它是一个字符串元组。所以基本上 Recv : ( String, String ) -> Msg
.
所以当你调用Recv name
,其中name : String
,你会得到一个类型错误。
这里有两种解决方案:
你把Recv
的定义改成
| Recv String String
这意味着您现在可以部分应用 Recv
构造函数并返回一个函数 String -> Msg
,这正是 Http.expectString
想要的。
您更改 expect 调用以获得正确的形状:
, expect = Http.expectString (\body -> Recv ( name, body ))
在这里你明确地创建了 Http.expectString
想要的功能。
第一次尝试用Elm做APP。我需要使用 Http.post.
与服务器应用程序交互我有这样的消息类型:
type Msg =
…
| Send (String, String)
| Recv (String, String)
更新函数是这样的:
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
…
Send (name, data) ->
(newModel, Http.post
{ url = url
, body = Http.multipartBody [Http.stringPart "data" data]
, expect = Http.expectString (Recv name)
})
Recv (name, data) -> … -- process data
但是当我 运行 这样做时,它会在 Http.post 中产生类型不匹配错误。 那么如何同时将 name 和 newData 传递给 Msg "Recv"?
您的类型构造函数 Recv
需要一个单独的参数,它是一个字符串元组。所以基本上 Recv : ( String, String ) -> Msg
.
所以当你调用Recv name
,其中name : String
,你会得到一个类型错误。
这里有两种解决方案:
你把
Recv
的定义改成| Recv String String
这意味着您现在可以部分应用
Recv
构造函数并返回一个函数String -> Msg
,这正是Http.expectString
想要的。您更改 expect 调用以获得正确的形状:
, expect = Http.expectString (\body -> Recv ( name, body ))
在这里你明确地创建了
Http.expectString
想要的功能。