首页 > 解决方案 > 如何在调用 doOnComplete 之前等待完成 doOnNext 中的所有任务?

问题描述

只是问我做的是否正确,因为我不知道为什么在尚未完成doOnComplete时调用?doOnNext

所以这就是为什么,我问的是如何doOnNext 在调用doOnComplete?

内部的另一个任务doOnNext是将数据插入数据库。

private val disposable = CompositeDisposable()

val branchUser : Observable<BranchUserResponse> = getApi().getBranchUser()
val areaUser : Observable<AreaUserResponse> = getApi().getAreaUser()
val regionalUser : Observable<RegionalUserResponse> = getApi().getRegionalUser()

disposable.add(
    Observable.merge(branchUser, areaUser, regionalUser)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext { it ->
            when (it) {
                is BranchUserResponse -> {
                    branchUserViewModel.addAll()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(
                            {
                                Log.i(TAG, "addAll success")
                                // the doOnComplete is already called before the Log here is call.
                                // Same with the other condition.
                                // What I want is to call this first before the doOnComplete or doFinally.
                            },
                            {
                                Log.e(TAG, "addAll failed", it)
                            }
                        )
                }
                is AreaUserResponse -> {
                    // some stuff here...
                }
                is RegionalUserResponse -> {
                    // some stuff here...
                }
            }
        }
        .doOnComplete {
            Log.i(TAG, "Complete")
        }
        .doFinally {
            Log.i(TAG, "Finally")
        }
        .subscribe()
)

任何帮助表示赞赏,谢谢。

标签: androidrx-java2

解决方案


如果要rx-stuff在指定的所有分支中执行,doOnNext则必须更改doOnNextflatMap

private val disposable = CompositeDisposable()

val branchUser : Observable<BranchUserResponse> = getApi().getBranchUser()
val areaUser : Observable<AreaUserResponse> = getApi().getAreaUser()
val regionalUser : Observable<RegionalUserResponse> = getApi().getRegionalUser()

disposable.add(
    Observable.merge(branchUser, areaUser, regionalUser)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap { it ->
            when (it) {
                is BranchUserResponse -> {
                    branchUserViewModel.addAll()
                }
                is AreaUserResponse -> {
                    // some stuff here...
                }
                is RegionalUserResponse -> {
                    // some stuff here...
                }
            }
        }
        .doOnComplete {
            Log.i(TAG, "Complete")
        }
        .doFinally {
            Log.i(TAG, "Finally")
        }
        .subscribe()
)

推荐阅读