給定以下單聲道:Mono<Void> mono1 = Mono.fromRunnable(() -> { System.out.println("sleep1"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new IllegalStateException(e); } System.out.println("mono1");});Mono<Void> mono2 = Mono.fromRunnable(() -> { System.out.println("mono2");});Mono<Void> mono3 = Mono.fromRunnable(() -> { System.out.println("mono3");});兩個都:mono1 .then(mono2) .then(mono3) .block();和:mono1 .and(mono2) .and(mono3) .block();具有相同的輸出:sleepmono1mono2mono3在這種情況下Mono#then和之間有什么區(qū)別?Mono#and來自https://projectreactor.io/docs/core/release/reference/index.html#which-operator:[如果你]有一個序列但[你]對值不感興趣并且[你]想在最后切換到另一個 Mono,[使用] Mono#then(mono)。[如果你]想通過協(xié)調他們從 1 Mono 和任何源到 Mono 的終止來合并發(fā)布者,[使用] Mono#and。#and不幸的是,這并不能幫助我找到一個#then行為不同的案例。
1 回答

嚕嚕噠
TA貢獻1784條經(jīng)驗 獲得超7個贊
Mono#and
只是“將來自當前單聲道和另一個源的終止信號加入到返回的無效單聲道中”。它總是返回Mono<Void>
并且只允許你協(xié)調兩個Mono
s 的終止。
Mono#then
允許您將兩個Mono
s 鏈接在一起,最終結果將由Mono
作為參數(shù)傳遞的值確定。從這個意義上說,Mono#then
是一個更原始的版本Mono#flatMap
,唯一的區(qū)別是您可以在鏈中Mono#flatMap
訪問前Mono
一個的結果,您可以將其轉換為另一個Mono
實例。
除此之外, withMono#then
操作將按順序執(zhí)行,而 withMono#and
不能保證順序(至少從文檔中是這樣)。
添加回答
舉報
0/150
提交
取消