WebFlux 根据不同的结果链接各种操作

问题描述 投票:0回答:1

我有这一系列的行动需要协调:

  • A) 检查用户是否已经付款
    boolean checkUserPayment(Long userId)
  • B) 如果上述 A) 为真,则继续
    UserInformation fetchUserInformationFromAPI(Long userID)
  • B) 如果上述 A) 为假,则立即中断并执行
    return Mono.just(PaymentResponse.alreadyPaid(userId))
  • C) 如果
    UserInformation fetchUserInformationFromAPI(Long userID)
    产生一个值,那么
  • D) 通过
    PaymentResponse sendPaymentRequest(PaymentRequest paymentRequest)
  • 发起付款
  • E) 如果 C) 没有产生用户或以某种方式中断,则不要转到 D)
    return Mono.just(PaymentResponse.Error(throwable)

总而言之,我想要一个像这样的方法:

Mono<PaymentResponse initiatePayment(Long userID)
协调上述步骤...

Mono
支持这样的场景吗?

感谢您的意见!

spring-webflux project-reactor
1个回答
0
投票

Reactive 支持此类场景。一般建议是将执行拆分为更小的方法。看看上面的示例。

public Mono<PaymentResponse> initiatePayment(Long userID){
    return Mono.fromSupplier(()->userID)
        .map(id->checkUserPayment(id))
        .flatMap(pending->pending ? someOtherOperation(userID): Mono.just(PaymentResponse.alreadyPaid(userId)));
}

public Mono<PaymentResponse> someOtherOperation(Long userID){
    return Mono.fromSupplier(()->userID)
        .map(id->fetchUserInformationFromAPI(id))
        .map(userInfo->sendPaymentRequest(PaymentRequest.from(userInfo)))
        .onErrorResume(throwable->Mono.just(PaymentResponse.Error(throwable)));
}
© www.soinside.com 2019 - 2024. All rights reserved.