Max*_*sky 3 java akka playframework playframework-2.2
对不起,我是Play Framework的新手.
我在Java API中使用它.
假设我想要一个控制器动作来运行某种导入并在导入完成后显示结果.
导入需要与第三方服务进行昂贵的HTTP通信(从3个URL获取数据,处理数据,在处理完所有3个资源后更新数据库).
所以我想将导入本身实现为控制器中的Promise(Controller不应该知道导入实现).
然后我想运行从URL获取数据并在3个并行线程中处理.我认为将它作为3个单独的Promise实现会很好.
只有当(并且如果)所有三个承诺成功完成时,才应更新数据库.
最后,数据库更新后应通知控制器.
我能够将整个导入实现为Promise,但我不知道如何实现嵌套的promises.
如果我试图使用错误的方法,你能建议如何实施或纠正我吗?
您可以使用flatmap实现此目的.由于匿名接口(Java 8和lambdas会更好),Java中的语法遗憾地有点笨拙.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;
}
});
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
如果您正在获取的每个不同的东西没有特殊含义 - 例如,如果要将它们视为值列表,您也可以使用Promise.sequence()它接受列表Promise<T>并返回a,Promise<List<T>>以便您可以对所有到达的值做出反应.