在Elm 0.18中,如何定义执行请求的函数,当接收到响应时,该函数将更新函数的消息作为参数?
如下代码:
mypost : String -> String -> msg -> Cmd msg
mypost url csrf mymsg =
Http.request
{ method = "POST"
, headers = [ Http.header "X-CSRFToken" csrf ]
, url = url
, body = Http.emptyBody
, expect = Http.expectJson mydecoder
, timeout = Nothing
, withCredentials = False
}
|> RemoteData.sendRequest
|> Cmd.map mymsg
Run Code Online (Sandbox Code Playgroud)
无法编译:
函数的参数
map导致不匹配。124 | Cmd.map m ^函数
map期望参数为:Run Code Online (Sandbox Code Playgroud)a -> msg但它是:
Run Code Online (Sandbox Code Playgroud)msg提示:函数似乎还需要1个参数。
如果味精接受一个参数怎么办?例如:
|> Cmd.map (mymsg myParamTomymsg)
Run Code Online (Sandbox Code Playgroud)
这导致我有很多代码重复,必须有更好的方法...
这个答案是假设您使用标准 Http 包编写的。如果您是 Elm 新手,我建议您先尝试一下并使用开源包。
代码中的类型mymsg应该是a -> msg,其中类型变量a与解码器生成的值的类型相同mydecoder
mypost : String -> String -> (a -> msg) -> Cmd msg
Run Code Online (Sandbox Code Playgroud)
您必须明确指定类型并替换a为响应类型。
换句话说,您必须明确指出传递给Http.send 的第一个参数是一个函数,它将响应映射到消息。
当您定义联合类型时,Msg是新类型的名称,NoOpwithUpdate是可以充当Msg类型值的构造函数的实际值。
type Msg
= NoOp
| Update String
Run Code Online (Sandbox Code Playgroud)
通过Update "Hello"在代码中使用,我们创建了一个Msg类型的值,其中字符串"Hello"被标记为Http.sendUpdate中发生同样的事情,只是标记值的类型预计是 Result 。
的类型Update隐含为String -> Msg
我们看一下Http.send 的类型注释定义:
send : (Result Error a -> msg) -> Request a -> Cmd msg
Run Code Online (Sandbox Code Playgroud)
以下是通用 GET 请求的示例:
get : Int -> Difficulty -> (Result Error TriviaResult -> msg) -> Cmd msg
get amount difficulty msg =
Http.get (triviaRequestUrl amount difficulty) decoder
|> Http.send msg
Run Code Online (Sandbox Code Playgroud)
您必须修复类型定义注释:
myget1 : (WebData HttpBin -> msg) -> Cmd msg
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。