2016-04-16 18 views
0
  • 私は20種類のイベントのストリームを持っています。
  • 私は、過去10秒以内に似たタイプのイベントが発生した場合、各イベントにブール値を設定したいと思います。
  • これはライブで発生するはずです。イベントを10秒間遅延させたくありません。
  • イベントストリームは連続しており、

が、これはRxJsで行うことができ終わりませんか?変換以前の値に基づいて観察可能

UPDATE:はここに私のイベントストリームのJsBinデモでhttp://jsbin.com/jepesu/1/edit?js,console,output

+0

は、あなたが求める動作を指定するには大理石のダイアグラムを行うことができますか?あなたの入力は何ですか?ペーストされたコピーが可能なサンプルデータが最適です。どんな場合でも、答えはおそらくはいです。 – user3743222

+0

イベントストリームのデモでJsBinを作成し、次に何が起こるべきかについてコメントしました。あなたは見てみることができますか? – cgross

答えて

0

(コメントを見てください)私は私の問題への解決策を見つけました。イベントは次のようになります。

{ 
    id: 0,   // unique 
    title: 'xxx', 
    sound: 'p0',  // One of 'p0', 'p1', 'p2' 
    playSound: false, // If the sound should be played 
} 

サウンドは、同じタイプのサウンドが最後の5秒間に再生されなかった場合にのみ再生されます。 playSoundは私がトグルしたいブール値です。そのために私はヘルパー関数が必要になります。今throttleMap

/** 
* Executes a map function on the first element in the window, returns the rest as is 
* In other words: Executes mapFunction on all elements the Rx.throttle() function would 
* emit, emits all other elements unchanged 
*/ 
Rx.Observable.prototype.throttleMap = function (windowDuration, mapFunction, scheduler) { 
    Rx.Scheduler.isScheduler(scheduler) || (scheduler = Rx.Scheduler.default); 
    var duration = +windowDuration || 0; 
    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); } 
    var source = this; 
    return new Rx.AnonymousObservable(function (o) { 
     var lastOnNext = 0; 
     return source.subscribe(
     function (x) { 
      var now = scheduler.now(); 
      if (lastOnNext === 0 || now - lastOnNext >= duration) { 
      lastOnNext = now; 
      o.onNext(mapFunction(x)); 
      } 
      else { 
      o.onNext(x); 
      } 
     },function (e) { o.onError(e); }, function() { o.onCompleted(); } 
    ); 
    }, source); 
    }; 

を解決:

const groupedSoundStream = singleNotificationStream 
    .groupBy(
    (x) => x.sound, 
    (x) => x 
) 
    .flatMap((x) => { 
    return x.throttleMap(5000, (x) => { 
     x.playSound = true 
     return x 
    }) 
    }) 

groupedSoundStream 
    .subscribe((x) => console.log(secSinceStart()+'s', x)) 

いくつかのサンプル出力:

0.3s { id: 0, title: 'M#0', sound: 'p2', playSound: true } 
0.6s { id: 1, title: 'M#1', sound: 'p1', playSound: true } 
0.9s { id: 2, title: 'M#2', sound: 'p1', playSound: false } 
1.2s { id: 3, title: 'M#3', sound: 'p0', playSound: true } 
1.5s { id: 4, title: 'M#4', sound: 'p2', playSound: false } 
1.8s { id: 5, title: 'M#5', sound: 'p0', playSound: false } 
2.1s { id: 6, title: 'M#6', sound: 'p1', playSound: false } 
2.4s { id: 7, title: 'M#7', sound: 'p2', playSound: false } 
2.7s { id: 8, title: 'M#8', sound: 'p2', playSound: false } 
3.1s { id: 9, title: 'M#9', sound: 'p1', playSound: false } 
3.4s { id: 10, title: 'M#10', sound: 'p1', playSound: false } 
3.7s { id: 11, title: 'M#11', sound: 'p1', playSound: false } 
4s { id: 12, title: 'M#12', sound: 'p2', playSound: false } 
4.3s { id: 13, title: 'M#13', sound: 'p0', playSound: false } 
4.6s { id: 14, title: 'M#14', sound: 'p2', playSound: false } 
4.9s { id: 15, title: 'M#15', sound: 'p1', playSound: false } 
5.2s { id: 16, title: 'M#16', sound: 'p2', playSound: false } 
5.5s { id: 17, title: 'M#17', sound: 'p2', playSound: true } 
5.8s { id: 18, title: 'M#18', sound: 'p0', playSound: false } 
6.1s { id: 19, title: 'M#19', sound: 'p2', playSound: false } 
6.4s { id: 20, title: 'M#20', sound: 'p1', playSound: true } 
6.7s { id: 21, title: 'M#21', sound: 'p2', playSound: false } 
7s { id: 22, title: 'M#22', sound: 'p1', playSound: false } 
関連する問題