gpt4 book ai didi

java - 同时有两个 Promise

转载 作者:行者123 更新时间:2023-11-30 07:28:38 26 4
gpt4 key购买 nike

我正在开发一个 Play 应用程序,该应用程序与其他第 3 方服务进行大量通信(检索数据)。我想做的是“合并”每个请求的结果。

更准确地说。我有三个外部 WSRequest,每个都封装在一个类中,该类具有一个方法,该方法将执行请求、检索 JSON 字符串并返回本质上是 JSON 反序列化版本的对象列表。极其简化,可以简化为这样。

Class A {
function F.Promise<List<ObjA>> call();
}
Class B {
function F.Promise<List<ObjB>> call(Integer id);
}
Class C {
function F.Promise<List<ObjC>> call();
}

从我的 Controller 中,我调用 A、B 和 C 的对象,进行一些处理并返回一个结果,该结果是另一个对象的 JSON 字符串(我们称之为 ObjD)。

在我的 Controller 中,我有这样的东西:

public F.Promise<Result> compute() {
A a = new A();
B b = new B();
C c = new C();

List<ObjA> objAList = a.call().get(TIMEOUT);
List<ObjB> objBList = b.call(objAList.get(0).getId()).get(TIMEOUT);
List<ObjC> objCList = c.call().get(TIMEOUT);

// compute something using the three lists. This will create an object objD

return F.Promise.promise(() -> ok(Json.toJson(objD)));
}

List 的结果取决于 A 的结果(因此不能同时调用它们)。显然,我可以简单地这样说:

public F.Promise<Result> compute() {
A a = new A();
B b = new B();
C c = new C();

List<ObjC> objCList = c.call(0.get(TIMEOUT);
return a.call().map(objAList -> {
List<ObjB> objBList = b.call(objAList.get(0).getId()).get(TIMEOUT);
// compute and make objD
return Json.toJson(objD);
});
}

但是我不知道的是是否(以及如何)同时执行对 A 和 C 的调用,并在收到两者后启动其余处理。因此,我不想调用 C、等待结果,然后才调用 A,而是希望能够同时触发 A 和 C 调用,并且一旦收到两者的结果,就可以对结果进行所需的计算.

谢谢

最佳答案

Play 中的 WS 请求默认是异步执行的。

这里的第一个问题是您强制 Play 等待/同步。使用F.Promise#get()这不是一个好主意。相反,您应该使用 map/flatMap 来操作响应 - 您部分地通过调用服务 A 来完成此操作。

如果您进一步查看 F.Promise API - 有一个名为 sequence 的方法- 您可以使用它 - 只需将所有 promise 收集在一个列表中并调用 F.Promise.sequence(myPromises) - 您将获得结果列表的单个 promise - 然后您可以使用它生成你的对象 D。

关于java - 同时有两个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36476301/

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