gpt4 book ai didi

java - 如何使用 Java 在 Play Framework 中嵌套 Promises?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:47:45 26 4
gpt4 key购买 nike

抱歉,我是 Play Framework 的新手。

我将它与 Java API 一起使用。

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

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

所以我想在 Controller 中实现一个导入本身作为 Promise( Controller 不应该知道导入实现)。

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

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

最后应该在数据库更新后通知 Controller 。

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

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

最佳答案

您可以使用平面图实现这一点。由于匿名接口(interface),Java 中的语法有点笨拙(Java 8 和 lambda 会变得更好)。 Promise<T>.flatMap接受 Function<T, Promise<U>>并将返回 Promise<U> .这意味着您可以嵌套来自所有三个操作的平面图,并使用平面图收集它们,如下所示:

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<T> 的列表并返回 Promise<List<T>>这样您就可以对到达的所有值使用react。

关于java - 如何使用 Java 在 Play Framework 中嵌套 Promises?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19832738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com