2017-06-22 83 views
0

我有兩個測試函數,我期望返回相同的結果。第一個(monoTest3)在'.then()'方法中使用lambda表達式。第二個不是。有人可以解釋Reactor Mono流中的.then()方法的注意事項嗎?

爲什麼我會得到結果?

使用ReactiveX和lambda表達式時,有什麼做什麼和不該做什麼?

在代碼下面進一步monoTest3產生

monoVoid called 
Success 
---- 
monoVoid2 called 
Success 

和monoTest4產生(所希望的結果):

monoVoid called 
monoVoid2 called 
Success 
---- 
monoVoid2 called 
monoVoid called 
Success 

最後的代碼。

private static Mono<Void> monoVoid() { 
    System.out.println("monoVoid called"); 
    return Mono.empty(); 
} 

private static Mono<Void> monoVoid2() { 
    System.out.println("monoVoid2 called"); 
    return Mono.just("Hello").then(); 
} 

@Test 
public void monoTest3() throws Exception { 
    monoVoid() 
      .then(v -> monoVoid2()) 
      .doOnSuccess(v -> System.out.println("Success")) 
      .block(); 

    System.out.println("----"); 

    monoVoid2() 
      .then(v -> monoVoid()) 
      .doOnSuccess(v -> System.out.println("Success")) 
      .block(); 
} 

@Test 
public void monoTest4() throws Exception { 
    monoVoid() 
      .then(MonoTest::monoVoid2) 
      .doOnSuccess(v -> System.out.println("Success")) 
      .block(); 

    System.out.println("----"); 

    monoVoid2() 
      .then(MonoTest::monoVoid) 
      .doOnSuccess(v -> System.out.println("Success")) 
      .block(); 

} 

回答

3

Mono.then(Function)3.0.7實際使用,將在3.1.0被刪除,因爲它的行爲是所有Mono其他then方法略有不同,所以我們預見到人眼花繚亂像你只是做。

在3.1.0(目前在里程碑2,所以3.1.0.M2)它現在被稱爲flatMap,和老flatMap,將返回現在FluxflatMapMany

這傳達了正確的語義更好,如果你知道一些關於flatMap那麼你就可以正確地推斷「的延續單」只能生產和認購時Mono看好到。

換句話說,調用Mono.just("foo").then().then(v -> {...})(3.0.x版本)或Mono.just("foo").then().flatMap(v -> {...})(3.1.0版本)是沒有意義的,因爲第一個then()的效果是沒有發射任何值。如果沒有值,lambda不會被調用(它的作用是將轉換爲延續值Mono。因爲相同的原因,調用Mono.empty().then(v -> {})沒有什麼意義。

+0

非常感謝您的解釋。 –