【问题标题】:How to nest Promises in Play Framework with Java?如何使用 Java 在 Play Framework 中嵌套 Promise?
【发布时间】:2013-11-07 09:52:47
【问题描述】:

抱歉,我是 Play 框架的新手。

我将它与 Java API 一起使用。

假设我想要一个控制器动作来运行某种导入并在导入完成后显示结果。

导入需要与第 3 方服务进行昂贵的 HTTP 通信(从 3 个 URL 获取数据、处理数据、在处理完所有 3 个资源后更新数据库)。

所以我想在控制器中实现导入本身作为 Promise(控制器不应该知道导入实现)。

然后我想运行从 URL 获取数据并在 3 个并行线程中进行处理。我认为将它实现为 3 个单独的 Promise 会很好。

只有在(并且如果)所有三个承诺都成功完成时,才应该更新数据库。

最后应该在数据库更新后通知控制器。

我能够将整个导入实现为 Promise,但我不知道如何实现嵌套的 Promise。

如果我尝试使用错误的方法,您能否建议如何实施或纠正我?

【问题讨论】:

    标签: java playframework akka playframework-2.2


    【解决方案1】:

    您可以使用平面地图来实现这一点。由于匿名接口,Java 中的语法有点笨拙(Java 8 和 lambdas 会变得更好)。 Promise<T>.flatMap 接受 Function<T, Promise<U>> 并将返回 Promise<U>。这意味着您可以从所有三个操作中嵌套 flatMaps 并使用 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(),它接受Promise&lt;T&gt; 的列表并返回Promise&lt;List&lt;T&gt;&gt; 这样您就可以对所有到达的值做出反应。

    【讨论】:

    • 关于是否具有特殊含义的响应组的关键是要做出关键区分。虽然我倾向于避免使用 Sequence,因为它在所有承诺都被兑现之前不会触发,所以我构建了一个承诺链,让每个承诺在兑现时发生。
    • 是的!一百万谢谢你,先生! flatMap 正是我需要将多个嵌套的 Result 返回转换为我最终的 Promise.
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多