我想将Flowable与Observable结合起来,从这些来源创建一个模型。
从房间我获得CartModel项目,此模型包含产品和数量的ID。
@Override
public Flowable<List<CartModel>> getCartItems() {
return appLocalDataStore.getCartItems();
}
之后我有一个函数,对于上面的每个id函数组成一对数量和产品细节。
@Override
public Observable<List<Pair<WsProductDetails, Integer>>> getCartWithProductData() {
return appLocalDataStore.getCartItems().toObservable().flatMap(new Function<List<CartModel>, ObservableSource<CartModel>>() {
@Override
public ObservableSource<CartModel> apply(List<CartModel> cartModels) throws Exception {
return Observable.fromIterable(cartModels);
}
}).flatMap(new Function<CartModel, ObservableSource<Pair<WsProductDetails, Integer>>>() {
@Override
public ObservableSource<Pair<WsProductDetails, Integer>> apply(final CartModel cartModel) throws Exception {
return appRemoteDataStore.getProductBySKU(cartModel.getId()).map(new Function<WsProductDetails, Pair<WsProductDetails, Integer>>() {
@Override
public Pair<WsProductDetails, Integer> apply(WsProductDetails wsProductDetails) throws Exception {
Log.d("TestCartItems", "SKU" + wsProductDetails.getSku() + " quantity" + cartModel.getQuantity());
return new Pair<>(wsProductDetails, cartModel.getQuantity());
}
});
}
}).toList().toObservable();
}
@GET(PATH_PRODUCT_DETAILS_BY_SKY)
Observable<WsProductDetails> getProductBySKU(@Path(PATH_CODE) String cod);
以上功能正常,因为日志是核心。
但在My Presenter OnNext()|| OnError()|| onComplete()函数永远不会被调用。 为什么会这样?
@Override
public void getCartItems() {
Observable<List<Pair<WsProductDetails, Integer>>> source = appDataStore.getCartWithProductData();
mCompositeDisposable.add(source
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribeWith(new DisposableObserver<List<Pair<WsProductDetails, Integer>>>() {
@Override
public void onComplete() {
Log.d(TAG, "onComplete()");
}
@Override
public void onNext(List<Pair<WsProductDetails, Integer>> pairs) {
Log.d(TAG, "onError()");
view.showCartItems(pairs);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError()");
}
}));
}
}
答案 0 :(得分:0)
您必须将查找flatMap应用于内部fromIterable,以便它变得有限:
@Override
public Observable<List<Pair<WsProductDetails, Integer>>> getCartWithProductData() {
return appLocalDataStore.getCartItems().toObservable().flatMap(new Function<List<CartModel>, ObservableSource<CartModel>>() {
@Override
public ObservableSource<CartModel> apply(List<CartModel> cartModels) throws Exception {
return Observable.fromIterable(cartModels)
.flatMap(new Function<CartModel, ObservableSource<Pair<WsProductDetails, Integer>>>() {
@Override
public ObservableSource<Pair<WsProductDetails, Integer>> apply(final CartModel cartModel) throws Exception {
return appRemoteDataStore.getProductBySKU(cartModel.getId())
.map(new Function<WsProductDetails, Pair<WsProductDetails, Integer>>() {
@Override
public Pair<WsProductDetails, Integer> apply(WsProductDetails wsProductDetails) throws Exception {
Log.d("TestCartItems", "SKU" + wsProductDetails.getSku() + " quantity" + cartModel.getQuantity());
return new Pair<>(wsProductDetails, cartModel.getQuantity());
}
});
}
}).toList().toObservable();
}
});
}