2017-10-13 77 views
0

我有以下代碼寫在RXJava中。RXJava邏輯圖鏈

validateProduct(payload) 
.map.(r -> { 
    if(r.getBoolean("valid")){ 
     return createProduct(productPayload); 
    }else{ 
     return null; // request.end() | end the chain here with some message as invalid product. 
    } 
}) 
.map(r -> { 
    return linkCategories(catPayload); 
}) 
.map(r -> { 
    return linkTags(tagPayload); 
}) 
.doOnError(e -> log.error(e)) 
.subscribe(r -> { 
    JsonObject response = new JsonObject().put("status", true); 
    request.end(response); 
}, e -> { 
    JsonObject response = new JsonObject().put("status", false); 
    request.end(response); 
}); 

第一個塊有一個條件檢查,此代碼現在不工作。什麼是處理RX中條件鏈的最佳方式?

回答

1

看起來你可能會遇到一個空指針異常。在RxJava v2中不可接受空值。您的第一張地圖可能會導致問題。

一般來說,當你需要條件邏輯在rxjava不得返回一個對象,你有兩個選擇:

  1. 回報是表示物體空(也可能是過濾出來)
  2. 使用的運營商像flatMap並加上一個空的Observable

它看起來像你可能會遇到一個空指針異常。在RxJavav2中不可接受空值。您的第一張地圖可能會導致問題。

選項1.

validateProduct(payload) 
.map.(r -> { 
    if(r.getBoolean("valid")){ 
     return createProduct(productPayload); 
    }else{ 
     return createEmptyProduct(); // generate non null placeholder object 
    } 
}) 
.filter(r->{ 
    // check here via method call or instanceOf to filter out empty products 
    r instanceof ValidProduct 
}).map(r -> { 
    return linkCategories(catPayload); 
}) 
.map(r -> { 
    return linkTags(tagPayload); 
}) 
.doOnError(e -> log.error(e)) 
.subscribe(r -> { 
    JsonObject response = new JsonObject().put("status", true); 
    request.end(response); 
}, e -> { 
    JsonObject response = new JsonObject().put("status", false); 
    request.end(response); 
}); 

選項2

validateProduct(payload) 
.flatMap(r -> { 
    if(r.getBoolean("valid")){ 
     return createProduct(productPayload); // Assuming this returns an observable if not use Observable.just(createProduct(productPayload)) 
    }else{ 
     return Observable.empty(); // request.end() | end the chain here with some message as invalid product. 
    } 
}) 
.map(r -> { 
    return linkCategories(catPayload); 
}) 
.map(r -> { 
    return linkTags(tagPayload); 
}) 
.doOnError(e -> log.error(e)) 
.subscribe(r -> { 
    JsonObject response = new JsonObject().put("status", true); 
    request.end(response); 
}, e -> { 
    JsonObject response = new JsonObject().put("status", false); 
    request.end(response); 
}); 
+0

在第二個選項,在這裏你正在返回'返回Observable.empty();','會linkCategories(catPayload)'調用? –

+0

@MinatoNamikaze nope –