首页 > 解决方案 > 是否可以实现像延迟这样的运算符,但也会延迟错误?

问题描述

我正在尝试一段时间来实现一个能够延迟正常项目排放和错误的扩展功能(只是因为它对我来说更容易)。现有的延迟运营商只会延迟正常的项目排放,错误会尽快交付。

对于上下文,我试图模仿 Android LiveData 的行为(有点)。LiveDatas 是一种可观察的模式实现,具有生命周期意识。他们的观察者只有在他们处于可以处理该发射的状态时才会收到通知。如果它们尚未准备好,则发射将缓存在 livedata 中,并在它们准备好后立即交付。

我创建了一个 BehaviourSubject,当它发生变化时它会发出我的活动和片段的状态。有了它,我创建了一个像这样的延迟运算符:

fun <T> Flowable<T>.delayUntilActive(): Flowable<T> = delay { lifecycleSubject.toFlowable(BackpressureStrategy.LATEST).filter { it.isActive } }

然后像这样使用它

myUseCase.getFlowable(Unit)
                .map { it.map { it.toDisplayModel() } }
                .delayUntilActive()
                .subscribe({
                    view.displaySomethings(
                }, { }).addTo(disposables)

因此,即使 myUseCase 在视图未准备好显示某些内容时发出,在视图准备好之前,发射也不会到达 onNext()。问题是我还希望在触发 onError 时视图显示错误(),但这也是生命周期敏感的。如果视图未准备好,应用程序将崩溃。

所以我正在寻找一种方法来延迟排放和错误(onComplete 也会很好)。这可能吗?我用 zip、onErrorReturn、delay inside delay 尝试了一些东西,但似乎没有什么是对的。如果这有一个我忽略的非常简单的解决方案,或者是不可能的,我会同样不为所动。欢迎任何想法。

奖励:对于 Single 和 Completable 还有什么更好的方法吗?目前我只是将它们转换为可流动的。

提前致谢!

标签: androidrx-java2reactivexrx-kotlin

解决方案


您可以通过 处理错误onErrorResumeNext,然后采取相同的错误并延迟它,delaySubscription直到您想要发出所述错误的信号发生:

source
.onErrorResumeNext({ error -> 
     Observable.error(error)
     .delaySubscription(lifecycleSubject.filter { it.Active } ) 
})

推荐阅读