RxJS 5:在保持最新值的同时跳过套接字提要
RxJS 5: skipping socket feed while keeping latest values
我一直在努力想出针对特定情况的 Rx 策略。我希望有人能给我指出正确的方向。
基本上,我有一个套接字提要,我想根据布尔值跳过它。当流跳过套接字时,我需要保留从套接字发送的最新值的 运行 缓冲区。
一旦我不再跳过套接字事件,然后将跳过时发出的最后一个值下推到流中,但仅在另一个条件(bool)下,然后重新开始监听套接字事件
所以基本上:
- 收听套接字提要
takeWhile(bool)
- 再次开始收听时,跳过时应用最后的值
套接字,如果
reapply==true
没走多远,但这就是我所拥有的:
Rx.Observable.interval(1000)
.skipWhile(()=>isSkipping)
.bufferWhileSkipping??
.applySkippedValuesAfterSkipping(ifisReapply)??
.subscribe(val=>console.log(val));
也许 skipWhile
不是正确的方法,但却是唯一一种有意义的方法……
你可以像下面那样做(我假设你的 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,当跳过设置为 [=16= 时,它只重新发出所有内容或链接 .takeLast(1)
运算符].
上面的示例将以下输出打印到控制台:
0
1
2
3
last:9
10
11
12
13
last:16
17
18
19
我一直在努力想出针对特定情况的 Rx 策略。我希望有人能给我指出正确的方向。
基本上,我有一个套接字提要,我想根据布尔值跳过它。当流跳过套接字时,我需要保留从套接字发送的最新值的 运行 缓冲区。
一旦我不再跳过套接字事件,然后将跳过时发出的最后一个值下推到流中,但仅在另一个条件(bool)下,然后重新开始监听套接字事件
所以基本上:
- 收听套接字提要
takeWhile(bool)
- 再次开始收听时,跳过时应用最后的值
套接字,如果
reapply==true
没走多远,但这就是我所拥有的:
Rx.Observable.interval(1000)
.skipWhile(()=>isSkipping)
.bufferWhileSkipping??
.applySkippedValuesAfterSkipping(ifisReapply)??
.subscribe(val=>console.log(val));
也许 skipWhile
不是正确的方法,但却是唯一一种有意义的方法……
你可以像下面那样做(我假设你的 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,当跳过设置为 [=16= 时,它只重新发出所有内容或链接 .takeLast(1)
运算符].
上面的示例将以下输出打印到控制台:
0
1
2
3
last:9
10
11
12
13
last:16
17
18
19