代码之家  ›  专栏  ›  技术社区  ›  j2emanue

Rxjava2-如何在可观察序列完成之前立即发出onNext()

  •  1
  • j2emanue  · 技术社区  · 6 年前

    我有两个观察点,它们被链接在一个平面图中,就像这样:

     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
                   })
    

    注意observate2如何依赖于observate1(limit参数)的结果。 两个观测值返回同一类型

    现在我的问题是,我希望observable1一旦完成,立即调用订阅者的onNext,但仍然继续执行flatmap。实际上,onNext的订户会被打两次电话是我想要的; 一旦 当observable1完成时 又是母鸡 当整个通话结束时。怎么安排?

    2 回复  |  直到 6 年前
        1
  •  0
  •   akarnokd    6 年前

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

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

    我不敢相信这是多么容易。我用了startWith,它发出了第一次观测的结果。一秒钟后,最终结果出来了。看起来是这样的:

    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
                   })