spring 通量.然后()在完成信号之前运行

myzjeezk  于 2022-11-21  发布在  Spring
关注(0)|答案(3)|浏览(111)

我尝试用通量流对象做一些事情,在处理所有元素后,做一些最后的工作,完成一个单声道,但它不起作用:

// 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信号”,并且没有理解这一点!
有人知道吗?

e5njpo68

e5njpo681#

then(methodCall(data))将急切地计算参数表达式,因此甚至在输入then之前就调用methodCall
我 * 认为 * 您正在寻找doOnComplete

public final Flux<T> doOnComplete(Runnable onComplete)

添加通量成功完成时触发的行为(副作用)。

myRepository.findById(id)
    .flatMap(dbObject -> doSomethingWithDbObjectAndSave(dbObject , data))
    .doOnComplete(() -> doOnFinish(data))
    .subscribe();
x3naxklr

x3naxklr2#

哇......几个小时后,我找到了一个解决方案。doOnComplete不返回来自doOnFinish(Mono)的异步调用的流。现在我找到了这个:

myRepository.findById(id)
   .flatMap(dbObject -> doSomethingWithDbObjectAndSave(dbObject , data))
   .takeLast(1)
   .flatMap(dbObject  -> doOnFinish(data))
   .subscribe();

对我来说很有效。

bxpogfeg

bxpogfeg3#

我认为flatMap在这里是多余的。相反,它可以做:

myRepository.findById(id)
    .flatMap(dbObject -> doSomethingWithDbObjectAndSave(dbObject , data))
    .then (Mono.deffer(()->doOnFinish(data)))
    .subscribe();

相关问题