我一直在努力为特定情况提出一个Rx战略。我希望有人能指出我正确的方向。
基本上,我有一个基于布尔值我想跳过的套接字源。当流正在跳过套接字时,我需要保留一个从套接字发送的最新值的运行缓冲区。
一旦我不再跳过套接字事件,然后向下推送流在跳过时发出的最后一个值,但仅在另一个条件下(bool),并重新开始侦听套接字事件
基本上是这样的:
takeWhile(bool)
reapply==true
没有走远,但这就是我所拥有的:
Rx.Observable.interval(1000)
.skipWhile(()=>isSkipping)
.bufferWhileSkipping??
.applySkippedValuesAfterSkipping(ifisReapply)??
.subscribe(val=>console.log(val));
也许skipWhile
不是正确的方法,但是唯一有意义的方法......
答案 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