【问题标题】:Is it possible to implement an operator like delay but that also delays errors?是否可以实现像延迟这样的运算符,但也会延迟错误?
【发布时间】:2019-08-13 00:10:33
【问题描述】:

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

对于上下文,我正在尝试模仿 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 还有什么更好的方法吗?目前我只是将它们转换为可流动的。

提前致谢!

【问题讨论】:

    标签: android rx-java2 reactivex rx-kotlin


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多