代码之家  ›  专栏  ›  技术社区  ›  Damn Vegetables

如何压缩(s1,o1),其中s1只发生一次,o1发生多次?

  •  0
  • Damn Vegetables  · 技术社区  · 8 年前

    假设s1和o1完成时我需要做,但s1只发生一次,o1发生多次,每次o1发生时我都需要做一些事情。我该怎么做?

    我尝试了以下代码,

    val s1 = Single.fromCallable {
        Log.d("so","executing s1");
        "hello";
    }.cache();
    
    var emitter:ObservableEmitter<String>? = null;
    val o1 = Observable.create<String> {
        emitter = it;
    }
    
    Observable.zip(s1.toObservable(),o1,
            BiFunction<String, String, Array<String>>() { t1, t2 -> arrayOf(t1,t2); })
            .subscribe { t1 ->
                Log.d("so", "Result = " + t1.joinToString(","));
            }
    
    emitter?.onNext("homer");
    emitter?.onNext("marge");
    emitter?.onNext("bart");
    Log.d("so", "Done");
    

    但结果是

    executing s1,
    Result = hello,homer
    Done
    

    当我预期的结果是

    executing s1,
    Result = hello,homer
    Result = hello,marge
    Result = hello,bart
    Done
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   akarnokd    8 年前

    使用 flatMap :

    s1.flatMapObservable({ t1 -> o2.map({ t2 -> arrayOf(t1, t2) }) })
    

    同时使用 PublishSubject 而不是将发射器偷偷取出:

    val o2 = PublishSubject.create();
    
    s1.flatMapObservable({ t1 -> o2.map({ t2 -> arrayOf(t1, t2) }) })
    .subscribe { t1 ->
        Log.d("so", "Result = " + t1.joinToString(","));
    }
    
    o2.onNext("homer");
    o2.onNext("marge");
    o2.onNext("bart");
    
    Log.d("so", "Done");