Elm:如何定义一个以消息为参数执行请求的函数

Fra*_*bar 5 elm

在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期望参数为:

a -> msg
Run Code Online (Sandbox Code Playgroud)

但它是:

msg
Run Code Online (Sandbox Code Playgroud)

提示:函数似乎还需要1个参数。

如果味精接受一个参数怎么办?例如:

|> Cmd.map (mymsg myParamTomymsg)
Run Code Online (Sandbox Code Playgroud)

这导致我有很多代码重复,必须有更好的方法...

hal*_*bra 4

这个答案是假设您使用标准 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)

我希望这有帮助。