3

申し訳ありませんが、私は Play Framework を初めて使用します。

私はJava APIでそれを使用します。

ある種のインポートを実行し、インポートの完了後に結果を表示するコントローラーアクションが必要だとしましょう。

インポートには、サード パーティ サービスとの高価な HTTP 通信が必要です (3 つの URL からのデータのフェッチ、データの処理、3 つのリソースすべてが処理された後のデータベースの更新)。

したがって、コントローラーで Promise としてインポート自体を実装したいと思います (コントローラーはインポートの実装を認識する必要はありません)。

次に、URL からデータを取得し、3 つの並列スレッドで処理を実行したいと思います。3つの別々のPromiseとして実装するといいと思います。

データベースは、3 つの約束がすべて正常に完了した場合にのみ更新する必要があります。

最後に、データベースが更新された後にコントローラーに通知する必要があります。

インポート全体を Promise として実装できますが、ネストされた Promise を実装する方法がわかりません。

間違ったアプローチを使用しようとしている場合は、それを実装する方法を提案するか、私を修正してもらえますか?

4

1 に答える 1

6

これは flatmap で実現できます。残念なことに、Java の構文は匿名インターフェースのために少し扱いに​​くいです (Java 8 とラムダで改善されます)。Promise<T>.flatMapを受け取り、Function<T, Promise<U>>を返しますPromise<U>。これは、次のように、3 つの操作すべてから flatMap をネストし、flatmap でそれらを収集できることを意味します。

final Promise<String> promise1 = Promise.pure("one");
final Promise<String> promise2 = Promise.pure("two");
final Promise<String> promise3 = Promise.pure("three");

Promise<String> allThreeCombined = promise1.flatMap(new Function<String, Promise<String>>() {
     @Override
     public Promise<String> apply(final String result1) throws Throwable {
         return promise2.flatMap(new Function<String, Promise<String>>() {
             @Override
             public Promise<String> apply(final String result2) throws Throwable {
                 return promise3.map(new Function<String, String>() {
                     @Override
                     public String apply(String result3) throws Throwable {
                         return result1 + result2 + result3;
                     }
                 });
             }
         });
     }
}); 

フェッチしているさまざまなもののそれぞれに特別な意味がない場合-たとえば、値のリストとして扱われる場合はPromise.sequence()、のリストを受け入れて aPromise<T>を返すものを使用して、Promise<List<T>>到着するすべての値に反応できるようにすることもできます。

于 2013-11-09T21:04:28.273 に答える