如何使用 switchIfEmpty RxJava [英] How to use switchIfEmpty RxJava

查看:119
本文介绍了如何使用 switchIfEmpty RxJava的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里的逻辑是,如果数据库中的评分为空,那么我想从 API 中获取它们.我有以下代码:

The logic here is that if the ratings in the database are empty, then I want to get them from the API. I have the following code:

Observable.from(settingsRatingRepository.getRatingsFromDB())
            .toList()
            .switchIfEmpty(settingsRatingRepository.getSettingsRatingModulesFromAPI())
            .compose(schedulerProvider.getSchedulers())
            .subscribe(ratingsList -> {
                view.loadRatingLevels(ratingsList, hideLocks);
            }, this::handleError);

getRatingsFromDB() 调用返回 List,但 API 调用返回 Observable>.

The getRatingsFromDB() call returns List<SettingRating>, but the API call returns Observable<List<SettingRating>>.

但是,当我对此进行单元测试时,当我从数据库调用中传递一个空列表时,它不会执行 API 调用.有人可以帮我解决这个问题.这是我的单元测试代码:

However, when I unit test this, when I pass an empty list from the database call, it does not execute the API call. Can someone pls help me in this matter. This is my unit test code:

when(mockSettingsRatingsRepository.getRatingsFromDB()).thenReturn(Collections.emptyList());
List<SettingsRating> settingsRatings = MockContentHelper.letRepositoryReturnSettingsRatingsFromApi(mockSettingsRatingsRepository);

settingsParentalPresenter.onViewLoad(false);

verify(mockView).loadRatingLevels(settingsRatings, false);

推荐答案

正如@Kiskae 所提到的,事实上我将空列表与空的 Observable 混淆了.因此,我使用了我想要的以下内容:

As @Kiskae mentioned, it's the fact that I am confusing an empty list with an empty Observable. Therefore, I have used the following which is what I want:

public void onViewLoad(boolean hideLocks) {
    Observable.just(settingsRatingRepository.getRatingsFromDB())
            .flatMap(settingsRatings -> {
                if (settingsRatings.isEmpty()) {
                    return settingsRatingRepository.getSettingsRatingModules();
                } else {
                    return Observable.just(settingsRatings);
                }
            })
            .compose(schedulerProvider.getSchedulers())
            .subscribe(ratingsList -> {
                view.loadRatingLevels(ratingsList, hideLocks);
            }, this::handleError);
}

这篇关于如何使用 switchIfEmpty RxJava的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆