2015-12-05 57 views
0

由於我在堆棧中使用Vertx 3.1,因此我正在考慮使用這些工具帶來的Future功能,但是在閱讀完API後,對我來說這似乎相當有限。我甚至無法找到讓未來等待Observable的方法。 這裏我的代碼Vertx Future不會等待

  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)); 
} 

在我的第一個可觀察I'm檢查結果的onComplete,並完成後,當我做完以後才能解鎖操作。 但我期待future.result不會阻止,直到future.complete被調用,因爲我期待。相反,只是返回null。

任何想法這裏有什麼錯?

問候。

回答

3

vertx future不會阻塞,而是會在注入結果時調用處理程序(請參閱setHandlerisComplete)。

如果代碼的外層需要Observable,則不需要將其包裝在Future中,只需返回Observable<T>即可。 Future<Observable<T>>沒有什麼意義,你在混合兩種做異步結果的方法。

請注意,有些方法可以將Observable摺疊到未來中,但難度在於Observable可能放出多個項目,而Future只能放置一個項目。您已經通過將您的結果收集到一張地圖中來照顧到這一點。

由於這Observable永遠只發出一個項目,如果你想有一個Future出來的,你應該subscribe它並調用future.complete(yourMap)onNext方法。還要定義一個onError處理程序,它將調用future.fail