イェソドの例外


93

非常に原始的な形式ipc(telnet を使用して、特定の単語を特定の順序で含む文字列を送信する)を使用するデーモンを作成しました。私はそれから飛び出し、現在サーバーにJSONメッセージを渡すために使用していYesodます。しかし、自分のデザインについて本当に気に入った点がいくつかありました。今、私の選択肢が何であるかわかりません。

これが私がやっていたことです:

buildManager :: Phase -> IO ()
buildManager phase = do
  let buildSeq = findSeq phase
      jid = JobID $ pack "8"
      config = MkConfig $ Just jid
  flip C.catch exceptionHandler $ 
  runReaderT (sequence_ $ buildSeq <*> stages) config
  -- ^^ I would really like to keep the above line of code, or something like it.
  return ()

buildSeqの各関数はこのように見えました

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMapあるTMVar Map現在のジョブについてそのトラックの情報が。

だから今、私が持っているのはハンドラーです、それはすべてこのように見えます

foo :: Handler RepJson

foo 私のデーモンのコマンドを表します。各ハンドラーは異なるJSONオブジェクトを処理する必要がある場合があります。

私がやりたいことはJSON、成功を表す1つのオブジェクトと、いくつかの例外に関する情報を非表示にする別のJSONオブジェクトを送信することです。

fooヘルパー関数がを返すことができるようにしたいのEitherですが、それをどのように取得できるかわからず、アクションリストの評価を終了する機能もありますbuildSeq

ここに私が見る唯一の選択があります

1)exceptionHandlerハンドラーにあることを確認してください。置きJobMapApp記録。例外の詳細getYesodJobMap示すために適切な値を変更することを使用して、次にアクセスできますfoo

もっと良い方法はありますか?

私の他の選択肢は何ですか?

編集:明確にするために、の役割を説明しHandler RepJsonます。サーバーは、などのコマンドを受け入れる何らかの方法を必要としますbuild stop report。クライアントはこれらのコマンドの結果を知る何らかの方法を必要とします。サーバーとクライアントが相互に通信する媒体としてJSONを選択しました。私はハンドラータイプを使用して、JSONの入出力のみを管理しています。

回答:


9

哲学的に言えば、Haskell / Yesodの世界では、値を後方に戻すのではなく、前方に渡したいと考えています。そのため、ハンドラーに値を返させる代わりに、プロセスの次のステップ(例外を生成する可能性がある)に転送を呼び出します。

将来のアクションをいくつでも1つのオブジェクトにバンドルできるので、継続オブジェクトをハンドラーとfoosに渡して、基本的に「完了したら、このコードのblobを実行する」と通知することを忘れないでください。そうすれば、それらは無効になり、何も返さなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.