2

我有一个 Elm 应用程序需要与使用HttpElm Platform 0.14.1 的服务器通信。应用程序需要在将请求发送到服务器之前验证其请求是否有效。

目前我正在使用一个函数makeRequest从模型中获取一些数据并Http.Request基于它返回无效请求Http.get ""。这是一个 hack,我想用适当的错误处理来替换它。

我拥有的功能类型是:

makeRequest : List String -> Request String
Http.send : Signal (Request a) -> Signal (Response String)

我想包装 in 的结果,makeRequest以便Result我可以正确处理错误。我也想换行Http.send以传播错误。

理想情况下,我想结束:

newMakeRequest : List String -> Result String (Request String)
newSend : Signal (Result String (Request a)) -> Signal (Result String (Response String))

构建newMakeRequest是微不足道的。但我不知道如何接近newSend,甚至是否可能。

4

1 回答 1

2

好的,所以您只需要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

我不确定您是否可以摆脱默认响应。而且我有点担心事件的顺序.. 响应是异步的,因此您可以在请求仍处于未决状态Err时立即从输出信号上的输入信号中获取 s 。Ok不知道如何解决。不确定这对你来说是否有问题。

于 2015-02-04T13:47:58.633 回答