【问题标题】:Rxjava2 - how to emit onNext() right away before observable sequence completesRxjava2 - 如何在可观察序列完成之前立即发出 onNext()
【发布时间】:2018-11-06 19:30:58
【问题描述】:

我有两个 observables 在 flatMap 中像这样链接在一起:

 override fun getProductObservable(): Observable<List<ProductModel>> {

return observable1(productId)
               .flatMap({
                 val limit = 8 - it.size
                   observable2(productId,  limit)
               }, { p1, p2 ->
                   p1.addAll(p2);  p1 //simply return observables1's results already packed with p2 results
               })

注意 observable2 如何依赖于 observable1 的结果(限制参数)。 两个 OBSERVABLE 返回相同的类型

现在谈到我的问题,我希望 observable1 完成后立即调用订阅者的 onNext,但仍继续使用平面地图。本质上,订阅者 onNext 将被调用两次是我想要的; 一次,当 observable1 完成时,再次,当整个调用完成时。这个怎么安排?

【问题讨论】:

    标签: kotlin rx-java2


    【解决方案1】:

    发布它并连接到最后一个值!

    observable1(productId)
    .publish( { shared ->
         Observable.concatArrayEager(
             shared.flatMap({
                 val limit = 8 - it.size
                   observable2(productId,  limit)
               }, { p1, p2 ->
                   p1.addAll(p2);
               }),
             shared.takeLast(1)
         )
    })
    

    【讨论】:

    • 我无法使其与 concatEager 一起使用,但我使用 concat 代替。但是当我在 onNext 中放置一个打印语句时,它只触发了一次。
    • 更新了答案,使用concatArrayEager
    • 我现在看到的情况是,在订阅者中,它打印了两次最后的结果。所以基本上它两次返回最终结果。我希望它在 onNext 返回 observable1 结果,然后返回最终结果。你执行过这个吗?也许我错过了一些东西,感谢你向我展示了 concatArrayEager
    • 在不知道observable1observable2 的定义以及可能在它们后面设置整个基础架构和数据源的情况下,我怎么能执行它?您的问题还说“订阅者 onNext 将被称为 两次”;我将此解释为您希望 observable1 的最后一项出现在最终输出中。
    • 我用粗体表示 observables 具有相同的类型。造成误会请见谅
    【解决方案2】:

    我简直不敢相信这是多么容易。我使用了 startWith,它发出了第一个 observable 的结果。一秒钟后,最终结果出来了。所以它看起来像这样:

    override fun getProductObservable(): Observable<List<ProductModel>> {
    
    return observable1(productId)
                   .flatMap({
                     val limit = 8 - it.size
                       observable2(productId,  limit)
                        .startWith(Observable.just(emptyList<ProductModel>()))
                   }, { p1, p2 ->
                       p1.addAll(p2);  p1 //simply return observables1's results already packed with p2 results
                   })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多