我尝试用通量流对象做一些事情,在处理所有元素后,做一些最后的工作,完成一个单声道,但它不起作用:
// data and id comming from a webrequest
// myRepository is a org.springframework.data.r2dbc.repository.R2dbcRepository
myRepository.findById(id)
.flatMap(dbObject -> doSomethingWithDbObjectAndSave(dbObject , data))
.then (doOnFinish(data))
.subscribe();
Mono<DbObject> doSomethingWithDbObjectAndSave (DbObject dbo, DataObject data){
...
}
Mono<Void> doOnFinish(DataObject data){
...
}
问题在于:即使我尝试这样做,函数“doOnFinish”在第一个元素传递doSomethingWithDbObjectAndSave”之前被调用,但我更改了数据对象上的某些内容,并希望在此之前这样做!
我试着换了个代号:
myRepository.findById(id)
.flatMap(dbObject -> doSomethingWithDbObjectAndSave(dbObject , data))
.last()
.flatMap(dbObject -> doOnFinish(data))
.subscribe();
我希望,我可以使用最后一个元素来触发onFinish函数,但我得到了“flux#last()没有观察到任何onnext信号”,并且没有理解这一点!
有人知道吗?
3条答案
按热度按时间e5njpo681#
then(methodCall(data))
将急切地计算参数表达式,因此甚至在输入then
之前就调用methodCall
。我 * 认为 * 您正在寻找
doOnComplete
:添加通量成功完成时触发的行为(副作用)。
x3naxklr2#
哇......几个小时后,我找到了一个解决方案。doOnComplete不返回来自doOnFinish(Mono)的异步调用的流。现在我找到了这个:
对我来说很有效。
bxpogfeg3#
我认为flatMap在这里是多余的。相反,它可以做: