由于我在堆栈中使用Vertx 3.1,我当时正在考虑使用工具带来的Future功能,但在阅读之后,API似乎对我很有限。我甚至找不到让未来等待Observable的方法。 这是我的代码
public Observable<CommitToOrderCommand> validateProductRestrictions(CommitToOrderCommand cmd) {
Future<Observable<CommitToOrderCommand>> future = Future.future();
orderRepository.getOrder(cmd, cmd.orderId)
.flatMap(order -> validateOrderProducts(cmd, order))
.subscribe(map -> checkMapValues(map, future, cmd));
Observable<CommitToOrderCommand> result = future.result();
if(errorFound){
throw MAX_QUANTITY_PRODUCT_EXCEED.create("Fail"/*restrictions.getBulkBuyLimit().getDescription())*/);
}
return result;
}
private void checkMapValues(Multimap<String, BigDecimal> totalUnitByRestrictions, Future<Observable<CommitToOrderCommand>> future,
CommitToOrderCommand cmd) {
for (String restrictionName : totalUnitByRestrictions.keySet()) {
Restrictions restrictions = Restrictions.valueOf(restrictionName);
if (totalUnitByRestrictions.get(restrictionName)
.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add)
.compareTo(restrictions.getBulkBuyLimit()
.getMaxQuantity()) == 1) {
errorFound = true;
}
}
future.complete(Observable.just(cmd));
}
在我的第一个Observable的onComplete中我正在检查结果,并且在完成之后是我完成将来解锁操作的时间。 但是我期待future.result不会阻塞,直到future.complete被调用,正如我所期待的那样。而只是返回null。
这里有什么问题吗?
问候。
答案 0 :(得分:3)
vertx future不会阻塞,而是使用在注入结果时调用的处理程序(请参阅setHandler
和isComplete
)。
如果外层代码需要Observable,则不需要将其包装在Future中,只需返回Observable<T>
即可。 Future<Observable<T>>
没有多大意义,你混合了两种做异步结果的方法。
请注意,有一些方法可以将Observable折叠为Future,但难点在于Observable可能会发出多个项目,而Future只能包含一个项目。您已经通过将结果收集到一张地图中来解决这个问题。
由于此Observable
只发出一个项目,如果您想要Future
,则应该subscribe
向其发送future.complete(yourMap)
onNext
} 方法。还要定义一个onError
处理程序,它将调用future.fail
。