错误处理和信号
Error handling and Signals
我有一个 Elm 应用程序需要在 Elm Platform 0.14.1 上使用 Http
与服务器通信。应用程序需要在将请求发送到服务器之前验证其请求是否有效。
目前我正在使用一个函数 makeRequest
从模型中获取一些数据并基于它制作一个 Http.Request
并返回无效请求 Http.get ""
。这是一个 hack,我想用正确的错误处理来替换它。
我拥有的函数类型有:
makeRequest : List String -> Request String
Http.send : Signal (Request a) -> Signal (Response String)
我想将 makeRequest
的结果包装在 Result
中,以便我可以正确处理错误。我还想包装 Http.send
以便传播错误。
理想情况下,我想结束:
newMakeRequest : List String -> Result String (Request String)
newSend : Signal (Result String (Request a)) -> Signal (Result String (Response String))
构造 newMakeRequest
很简单。但我不确定如何处理 newSend
或者是否可能。
好的,所以您只需要 newSend
对吧?这是可能的:
newSend : Result x (Reponse a) -> Signal (Result x (Request a)) -> Signal (Result x (Response a))
newSend defaultResp s =
let reqs =
s |> Signal.keepIf isOk (Ok (Http.get ""))
|> Signal.map unpackOk
errs =
s |> Signal.dropIf isOk defaultResp
|> Signal.map errIdentity
in Signal.merge errs (Signal.map Ok (Http.send reqs))
-- Change the type of an Err Result.
errIdentity : Result x a -> Result x b
errIdentity =
Result.map (Debug.crash "errIdentity: Don't call this function on an Ok!")
unpackOk : Result x a -> a
unpackOk =
case res of
Ok a -> a
Err x -> Debug.crash "unpackOk: Don't call this function on an Err!"
isOk : Result x a -> Bool
isOk res =
case res of
Ok _ -> True
Err _ -> False
我不确定您是否可以去掉默认响应。我有点担心事件的顺序。响应是异步的,因此当 Ok
请求仍未决时,您可能会立即从输出信号的输入信号中获得 Err
s。不知道如何解决这个问题。不确定这对您来说是否也是个问题。
我有一个 Elm 应用程序需要在 Elm Platform 0.14.1 上使用 Http
与服务器通信。应用程序需要在将请求发送到服务器之前验证其请求是否有效。
目前我正在使用一个函数 makeRequest
从模型中获取一些数据并基于它制作一个 Http.Request
并返回无效请求 Http.get ""
。这是一个 hack,我想用正确的错误处理来替换它。
我拥有的函数类型有:
makeRequest : List String -> Request String
Http.send : Signal (Request a) -> Signal (Response String)
我想将 makeRequest
的结果包装在 Result
中,以便我可以正确处理错误。我还想包装 Http.send
以便传播错误。
理想情况下,我想结束:
newMakeRequest : List String -> Result String (Request String)
newSend : Signal (Result String (Request a)) -> Signal (Result String (Response String))
构造 newMakeRequest
很简单。但我不确定如何处理 newSend
或者是否可能。
好的,所以您只需要 newSend
对吧?这是可能的:
newSend : Result x (Reponse a) -> Signal (Result x (Request a)) -> Signal (Result x (Response a))
newSend defaultResp s =
let reqs =
s |> Signal.keepIf isOk (Ok (Http.get ""))
|> Signal.map unpackOk
errs =
s |> Signal.dropIf isOk defaultResp
|> Signal.map errIdentity
in Signal.merge errs (Signal.map Ok (Http.send reqs))
-- Change the type of an Err Result.
errIdentity : Result x a -> Result x b
errIdentity =
Result.map (Debug.crash "errIdentity: Don't call this function on an Ok!")
unpackOk : Result x a -> a
unpackOk =
case res of
Ok a -> a
Err x -> Debug.crash "unpackOk: Don't call this function on an Err!"
isOk : Result x a -> Bool
isOk res =
case res of
Ok _ -> True
Err _ -> False
我不确定您是否可以去掉默认响应。我有点担心事件的顺序。响应是异步的,因此当 Ok
请求仍未决时,您可能会立即从输出信号的输入信号中获得 Err
s。不知道如何解决这个问题。不确定这对您来说是否也是个问题。