亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在哪里使用 Mono/Flux?

在哪里使用 Mono/Flux?

冉冉說 2021-12-10 16:34:31
我有點被迫切換到響應式編程(并且在很短的時間內),使用 WebFlux 并且我很難理解它。也許是因為缺少示例,或者因為我從未做過函數式編程。無論如何,我的問題是在哪里使用 Mono/Flux 以及在哪里可以使用普通對象?例如,我的控制器正在等待 @Valid User 對象,它應該是 @Valid Mono 還是 Mono<@Valid User> 之類的東西?如果假設它只是一個 User 對象,我將它傳遞給我的服務層,并且我想在將密碼保存到反應式 MongoDb 之前對密碼進行編碼,我應該寫:User.setPassword(...); return reactiveMongoDbRepository.save(user); //returns Mono<User> which is returned by the Controller to the View或者它應該是這樣的return Mono.just(user).map.flatmap(setPasswordSomewhereInThisHardToFollowChain).then.whatever.doOnSuccess(reactiveMongoDbRepository::save);換句話說,我是否被迫在任何地方使用這個管道來保持反應性或以命令方式執行某些步驟,例如解開對象,處理它,然后將它包裝回去?我知道我的問題似乎很愚蠢,但我根本沒有大局觀,閱讀有關它的書籍還沒有真正幫助,請對我溫柔點。:)
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

當您需要順序、異步和延遲執行時,請使用流水線。在所有其他情況下(當您使用非阻塞代碼時),您可以自由選擇任何方法,通常最好使用最簡單的方法。


順序非阻塞代碼可以組織成函數,您可以使用 map/filter/doOnNext/... 組件將這些函數與反應式管道集成。


例如,考慮以下Order價格計算代碼。


class PriceCalculator {


  private final Map<ProductCode, Price> prices;


  PriceCalculator(Map<ProductCode, Price> prices) {

    this.prices = prices;

  }


  PricedOrder calculatePrice(Order order) { // doesn't deal with Mono/Flux stuff

    Double price = order.orderLines.stream()

      .map(orderLine -> prices.get(orderLine.productCode))

      .map(Price::doubleValue)

      .sum();

    return new PricedOrder(order, price);

  }

}


class PricingController {


  public Mono<PricedOrder> getPricedOrder(ServerRequest request) {

    OrderId orderId = new OrderId(request.pathVariable("orderId"));

    Mono<Order> order = orderRepository.get(orderId);

    return order.map(priceCalculator::calculatePrice)

  }

}


查看完整回答
反對 回復 2021-12-10
  • 1 回答
  • 0 關注
  • 202 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號