kotlin - react subscribe() 函数结束后需要开始一行代码
问题描述
val totalNumInst = TotalNumObj()
devSupportService.sendAllTalktalkMessages(naverId)
devSupportService.sendAllAutoDepositTalktalkMessages(naverId, totalNum)
logger.info("${totalNumInst.totalNum}")
Mono<>
.doOnSuccess { }
.subscribe()
前两行执行几个 Mono<>.subscribe() 函数。在每个 Mono<> 的 .doOnSuccess{} 中,totalNum
变量都在增加。在最后一行,我添加了一个显示totalNum
. 但totalNum
变量始终显示初始值 0。
我需要留下一个日志,显示 Mono<>.subscribe() 执行了多少次。感谢您阅读我的问题。
解决方案
有两种方法可以解决您的问题。阻塞和非阻塞。
阻塞
创建一个countDownLatch,将其传递给sendAllTalktalkMessages和sendAllAutoDepositTalktalkMessages,然后等待它被锁定
val totalNumInst = TotalNumObj()
val latch = CountDownLatch(2)
devSupportService.sendAllTalktalkMessages(naverId, totalNumInst, latch)
devSupportService.sendAllAutoDepositTalktalkMessages(naverId, totalNumInst, latch)
if (!latch.await(30, TimeUnit.SECONDS)) {
throw TimeoutException("Waiting timed out")
}
logger.info("${totalNumInst.totalNum}")
并添加latch.countDown()
到每个doOnSuccess
(但我建议在 doFinally 倒计时,以防链发送错误信号)
Mono<>
.doOnSuccess { latch.countDown() }
.subscribe()
这是阻塞解决方案,它反对反应式非阻塞概念。
非阻塞
使 sendAllTalktalkMessages 和 sendAllAutoDepositTalktalkMessages 返回 Mono 并压缩它们(此外,在这种情况下,您不需要将 totalNumInst 传递给它们)
Mono.zip(
devSupportService.sendAllTalktalkMessages(naverId)
.map { 1 }
.onErrorResume { Mono.just(0) }
.defaultIfEmpty(0),
devSupportService.sendAllAutoDepositTalktalkMessages(naverId)
.map { 1 }
.onErrorResume { 0 }
.defaultIfEmpty(0)
) { counter1, counter2 -> counter1 + counter2 }
.subscribe { totalNum -> logger.info("$totalNum") }
在这种实现中,您将每个成功计为 1,将每个错误或空信号计为 0。
推荐阅读
- c# - DbContext.Entities.FromSqlRaw 没有实现?
- python - 如何在 Dask 系列的一列中重新排列每个字符串的块?
- functional-programming - 了解 OCaml Lwt.return_unit
- android - err_cert_authority_invalid - 自签名 CA 在 android 上无效,但在 PC 上有效
- javascript - 调用 Dialogflow API 时如何指定代理 ID?
- r - 识别组内重复值的第一个实例
- javascript - 用javascript自动填写表格
- javascript - getImageData:无法从画布获取图像数据,因为画布已被跨域数据污染
- c++ - 使用 std::bind 绑定函数的问题
- redis - 我们如何实现拒绝对 redis 缓存的旧更新