RxJS 5:在保持最新值的同时跳过套接字源

时间:2017-04-04 23:00:35

标签: rxjs rxjs5

我一直在努力为特定情况提出一个Rx战略。我希望有人能指出我正确的方向。

基本上,我有一个基于布尔值我想跳过的套接字源。当流正在跳过套接字时,我需要保留一个从套接字发送的最新值的运行缓冲区。

一旦我不再跳过套接字事件,然后向下推送流在跳过时发出的最后一个值,但仅在另一个条件下(bool),并重新开始侦听套接字事件

基本上是这样的:

  • 收听套接字Feed
  • takeWhile(bool)
  • 再次开始收听时,请在跳过时应用最后一个值 socket,如果reapply==true

没有走远,但这就是我所拥有的:

Rx.Observable.interval(1000)
.skipWhile(()=>isSkipping)
.bufferWhileSkipping??
.applySkippedValuesAfterSkipping(ifisReapply)??
.subscribe(val=>console.log(val));

也许skipWhile不是正确的方法,但是唯一有意义的方法......

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式执行此操作(我假设您的isSkipping可以是Observable):

const isSkipping = new BehaviorSubject(false);

Observable.interval(100)
  .take(20)
  .window(isSkipping)
  .withLatestFrom(isSkipping)
  .switchMap(([observable, skipping]) => skipping
    ? observable.takeLast(1).map(val => 'last:' + val)
    : observable)
  .subscribe(console.log);

setTimeout(() => isSkipping.next(true), 500);
setTimeout(() => isSkipping.next(false), 1050);
setTimeout(() => isSkipping.next(true), 1500);
setTimeout(() => isSkipping.next(false), 1850);

每次isSkipping发出一个值时,window运算符都会创建一个新的Observable,当跳过设置为.takeLast(1)时,它只会重新发出所有内容或链接true运算符。

上面的示例将以下输出打印到控制台:

0
1
2
3
last:9
10
11
12
13
last:16
17
18
19