Play 2 で Iteratees を使用して彗星の結果をストリーミングする方法をつかもうとしています。コールバックから列挙子を作成し、マップから列挙子を作成するハンドルを取得しました。私の問題は Enumeratee.map にあります。これは、純粋な入力を受け取り、純粋な出力を返す関数を受け取ります (例: docの String から Int への変換)。私がやりたいことは、純粋な入力を取り、結果の約束を返すことです。結局、列挙子は enumeratee に promise を供給し、enumeratee は 1 つの列挙子を別の列挙子に変換するため、promise にマップする enumeratee を作成する方法が必要です。
さて、これをもう少し明確にするために例を挙げましょう。データベースでクエリする ID のリストを含む HTTP リクエストが届いたとします。これらの ID がデータベース テーブルの行を表し、リクエストがこれらの行に対して一連の (長い) 計算を実行し、計算を表す一連の json オブジェクトを返すとします。私は長い間ブロックする必要があるため、一度に 1 つの ID をストリーミングするのはクールなので、次のような enumeratee パイプラインが必要です。
- データベース内の行を照会します (行の promise を返します)
- 行に対して長い計算を行います (行を取り、計算の約束を返します)
- 長い計算を JSON に変換する
- &> これを Play 2 が提供する Comet enumeratee に渡します
1 はちょっと簡単です。クエリ結果の約束を返す fromCallback を使用して列挙子を作成できます。3 も簡単です。単純な Enumeratee.map です。
しかし、ステップ2のenumerateeのapplyOnを実装する方法に頭を悩ませることはできません。「内側の」イテラティーからプロミスを取得し、長い計算をflatMapして返す新しいイテラティーを構築する必要があることを理解できます。新しい約束。私が得られないのは、奇妙なapplyOn署名を考慮してこれを作成する方法です:def applyOn[A](it: Iteratee[To, A]): Iteratee[From, Iteratee[To, A]]
誰かがそれを手伝ってくれますか?
ありがとう