将值从单个传递到可完成,以产生 rxjava Android



这就是我想要的:

  1. 检查数据库中是否有有关产品的数据。
  2. 如果我有数据,我会运行 Single 从数据库获取数据。
  3. 如果没有,我运行 Single 从后端获取数据
  4. 如果我得到响应,我想使用 Completable 将数据保存在数据库中。
  5. 保存数据后,我想将步骤 2 或 3 中的值映射到查看模型
  6. 结果我想将数据发送到活动。

这就是我现在拥有的:

checkProductsInDBUseCase.run()
                .flatMap {
                    if (it) {
                        getProductsFromDBUseCase.run()
                    } else {
                        getProductsUseCase.run(3)
                    }
                }.map {
                    it.products.map { item -> item.toViewModel() }
                }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeBy(
                        onSuccess = {
                            view.showBikes(it)
                        },
                        onError = {
                            view.showBikesError(it.message.toString())
                        }
                ).addTo(disposables)

在平面地图和地图之间,我需要运行saveDataUseCase(it),但我不知道如何将it从完成传递到地图。有什么想法吗?

如果你的saveDataUseCase((是可处理的,那么你可以这样做

checkProductsInDBUseCase.run()
        .flatMap {
            if (it) {
                getProductsFromDBUseCase.run()
            } else {
                getProductsUseCase.run(3)
            }
        }
        .faltMap {
             saveDataUseCase(it).toSingleDefault(it)
        }
        .map {
            it.products.map { item -> item.toViewModel() }
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(
                onSuccess = {
                    view.showBikes(it)
                },
                onError = {
                    view.showBikesError(it.message.toString())
                }
        ).addTo(disposables)

但是,如果将 saveDataUseCase(( 的返回类型更改为 Unit,则可以使用 Fred 的答案。会更好

在这里我会使用 doOnSuccess .这似乎是理想的,特别是因为您正在创建副作用,我们通常使用doOnXXX方法。

checkProductsInDBUseCase.run()
            .flatMap {
                if (it) {
                    getProductsFromDBUseCase.run()
                } else {
                    getProductsUseCase.run(3)
                }
            }
            .doOnSuccess {
                 saveDataUseCase(it)
            }
            .map {
                it.products.map { item -> item.toViewModel() }
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                    onSuccess = {
                        view.showBikes(it)
                    },
                    onError = {
                        view.showBikesError(it.message.toString())
                    }
            ).addTo(disposables)

该方法不会更改flatMap的结果,因此您仍然可以在 map 函数中获得正确的对象。