2 回答

TA貢獻(xiàn)1817條經(jīng)驗 獲得超14個贊
要以最簡單的形式直接回答問題,您可以使用Mono.block()
.
但你幾乎肯定不應(yīng)該,因為這會阻塞線程,首先破壞了使用反應(yīng)堆的意義。相反,您應(yīng)該調(diào)用subscribe()
并提供消費者。當(dāng)發(fā)出一個值時,消費者將被異步調(diào)用Mono
,該值作為參數(shù)。
當(dāng)然,沒有什么本質(zhì)上可以阻止您將值分配給一個字段:
mono.subscribe(v?->?this.value?=?v);
...但這在實踐中的用處非常有限,因為您不知道該字段何時會被初始化。
更正常的方法是一次性調(diào)用訂閱者中的其他方法:
mono.subscribe(v?->?{ ????oneMethodThatNeedsTheValue(v); ????anotherMethodThatNeedsTheValue(v); });
...或使用Mono.cache()
并傳遞它:
class Test {
? ? void useMonoVal(Mono<String> mono) {
? ? ? ? mono.subscribe(s -> System.out.println("I need to see " + s));
? ? }
? ? void anotherMethod(Mono<String> mono) {
? ? ? ? mono.subscribe(s -> System.out.println("I need to talk to " + s));
? ? }
? ? public static void main(String[] args) {
? ? ? ? Mono myMono = Mono.just("Bob").cache();
? ? ? ? Test t = new Test();
? ? ? ? t.useMonoVal(myMono);
? ? ? ? t.anotherMethod(myMono);
? ? }
}
(該cache()方法確保Mono只評估一次,然后為所有未來的訂閱者緩存,這在使用just()工廠時當(dāng)然是無關(guān)緊要的,但只是為了一個完整的例子。)
擴(kuò)展一下,使用反應(yīng)式范式(因此反應(yīng)器,并通過擴(kuò)展它Mono和Flux對象)的全部意義在于它使您能夠以非阻塞方式進(jìn)行編碼,這意味著當(dāng)前的執(zhí)行線程不會“被阻止” " 等待單聲道發(fā)出一個值。
旁注:我不確定它是否與問題直接相關(guān),但你不能這樣做a.map(System.out::println);- 你可能是說a.subscribe(System.out::println);.

TA貢獻(xiàn)2011條經(jīng)驗 獲得超2個贊
在從單聲道對象獲取字符串之前,您必須訂閱
public class MonoT {
? ? ? ? static String x = null;
? ? ? ? public static void main(String[] args) {
? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? Mono<String> username = Mono.just("Naren");
? ? ? ? ? ??
? ? ? ? ? ? username.subscribe(v->{
? ? ? ? ? ? ? ? x = v;
? ? ? ? ? ? });?
? ? ? ? ? ??
? ? ? ? ? ? System.out.println(x);
? ? ? ? }
? ??
? ? }
添加回答
舉報