2

HttpElm Platform 0.14.1を使用してサーバーと通信する必要がある Elm アプリがあります。アプリは、リクエストをサーバーに送信する前に、そのリクエストが有効であることを検証する必要があります。

現在、関数makeRequestを使用してモデルからデータを取得し、Http.Requestそれに基づいて無効なリクエストを返しHttp.get ""ます。これはハックであり、適切なエラー処理に置き換えたいと考えています。

私が持っている機能の種類は次のとおりです。

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

エラーを適切に処理できるように、 makeRequestinの結果をラップしたいと考えています。また、エラーが伝播するよう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 に答える