下面的代碼確實網絡調用正常。但它不斷髮出相同的結果。我想只取得第一個結果並停止排放。有沒有我能說的發出第一個命令。我試圖採取(1),但由於某種原因改變了結果的大小。Rxjava2 - 如何讓觀察者在第一次停止發射物品或使用zipWith?
//class variables
FeedsModel feedsModelResult;
HashMap<Integer, ProductModel> productMap;
//method
@Override
protected Observable buildUseCaseObservable() {
/* gets feedModel then parses through each feed for product IDs. then does a network call to get each product. stores retrieved
product model in hashmap for quick retrieval. returns a pair.
*/
return feedRepository.fetchFeeds(shopId, langId, skip)
.concatMap(new Function<FeedsModel, ObservableSource<List<Feed>>>() {
@Override
public ObservableSource<List<Feed>> apply(@NonNull final FeedsModel feedsModel) throws Exception {
feedsModelResult = feedsModel;
return Observable.fromCallable(new Callable<List<Feed>>() {
@Override
public List<Feed> call() throws Exception {
return feedsModel.getFeed();
}
});
}
})
.concatMap(new Function<List<Feed>, ObservableSource<Feed>>() {
@Override
public ObservableSource<Feed> apply(@NonNull List<Feed> feeds) throws Exception {
return Observable.fromIterable(feeds);
}
}).filter(new Predicate<Feed>() {
@Override
public boolean test(@NonNull Feed feed) throws Exception {
return feed.getProducts() != null;
}
})
.concatMap(new Function<Feed, ObservableSource<Double>>() {
@Override
public ObservableSource<Double> apply(@NonNull Feed feed) throws Exception {
return Observable.fromIterable((ArrayList<Double>) feed.getProducts());
}
})
.concatMap(new Function<Double, ObservableSource<ProductModel>>() {
@Override
public ObservableSource<ProductModel> apply(@NonNull Double productId) throws Exception {
return productsRepository.fetchProduct(productId.intValue(), shopId, langId, currency);
}
}).concatMap(new Function<ProductModel, ObservableSource<Map<Integer, ProductModel>>>() {
@Override
public ObservableSource apply(@NonNull ProductModel productModel) throws Exception {
productMap.put(productModel.getIdProduct(), productModel);
return Observable.fromCallable(new Callable<Map<Integer, ProductModel>>() {
@Override
public Map<Integer, ProductModel> call() throws Exception {
return productMap;
}
});
}
}).concatMap(new Function<Map<Integer, ProductModel>, ObservableSource<Pair>>() {
@Override
public ObservableSource apply(@NonNull final Map<Integer, ProductModel> productModelMap) throws Exception {
return Observable.fromCallable(new Callable() {
@Override
public Object call() throws Exception {
return Pair.create(feedsModelResult, productMap);
}
});
}
});
}
UPDATE: 在onSubscribe我一直到一次性的參考和onNext對其進行處理()後,我得到的第一個結果。這種做法有效嗎?
最後調用的結果Pair.create(feedsModelResult,productMap);我想我應該使用zipWith運算符來等待所有的結果完成,但我不知道如何