2017-06-06 5 views
0

私はUIから発するを受け取るPublishSubjectを持っている:大きな遅延があった場合、アイテム感情の間のObservableで関数を実行するにはどうすればいいですか?

myPublishSubject 
     .map { 
      ... 
     } 
     .doOnNext { 
      // using emitted item 
     } 
     .timeout (...) // wait for the gap! 
     .doOnNext { 
      // running a function after a specific gap between two item 
     } 
     .subscribe() 

私は(それが後で発光続ける原因、onCompleteのない)最後のEMITの後に特定の時間を待って、機能を実行したいです。これは、アイテム感情の間のギャップと解釈することができます。

私はtimeoutのようなものを探していますが、この方法の問題はObservableでエラーが発生することです。

+0

あなたは 'flatMap()/ concatMap()'を使用して遅延を内部に入れることができます。 –

+0

@PhoenixWang私は 'flatMap()/ concatMap()'を使ってこれをどのようにするべきかわかりません! –

答えて

2

あなたは、例えばpublishswitchMapで少し創造的でなければならない:

PublishSubject<Integer> ps = PublishSubject.create(); 

ps.publish(o -> 
    o.mergeWith(
     o.switchMap(e -> 
      Observable.just(1).delay(200, TimeUnit.MILLISECONDS) 
      .ignoreElements() 
      .doOnCompleted(() -> System.out.println("Timeout action: " + e)) 
     ) 
    ) 
).subscribe(System.out::println); 

ps.onNext(1); 
ps.onNext(2); 

Thread.sleep(100); 

ps.onNext(3); 

Thread.sleep(250); 

ps.onNext(4); 

Thread.sleep(250); 

これは二つの方法にソースおよびルーティングを共有することによって動作する、他が受信するswitchMapを供給しながら、一方が直接放出されます新しいアイテムは遅延Observableを開始し、その完了に反応します(mergeWithの重複イベントを避けるために元のトリガー要素は無視します)。猶予期間中に新しい信号があると、switchMapは前の遅延をキャンセルし、新しい遅延で開始します。

関連する問題