Javascript 如何仅缓冲来自可观察源的选定项目集,并立即发出其他项目?
例如,我有一个每秒发射一个数字的可观测对象。我想将它们缓冲到数组中4秒钟。但是,当源发出一个可以被5整除的数字时,我想立即发出它,而不是缓冲它Javascript 如何仅缓冲来自可观察源的选定项目集,并立即发出其他项目?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,例如,我有一个每秒发射一个数字的可观测对象。我想将它们缓冲到数组中4秒钟。但是,当源发出一个可以被5整除的数字时,我想立即发出它,而不是缓冲它 // emit value in sequence every 1 second // 0,1,2,3,4,5... const source = interval(1000); // buffer values for 4 seconds const buffered = source.pipe( buffer(interval(4000)),
// emit value in sequence every 1 second
// 0,1,2,3,4,5...
const source = interval(1000);
// buffer values for 4 seconds
const buffered = source.pipe(
buffer(interval(4000)),
filter(x => x.length > 0)
);
const subscribe = buffered.subscribe(val => console.log(val));
我的预期结果是:
[0,1,2,3] // buffered and emitted after 4 seconds
[5] // emitted immediately
[4,6,7,8] // buffered and emitted after 4 seconds
[10] // emitted immediately
[9,11,12,13]
// ... and so on
Stackblitz:让两个具有不同职责的可观察对象合并在一起怎么样
const source = interval(1000);
// buffer values for 4 seconds
const buffered = source.pipe(
buffer(interval(4000)),
filter(x => x.length > 0)
);
const multipleOfFive = source.pipe(
filter(x => x % 5 === 0)
);
const subscribe = merge(buffered, multipleOfFive).subscribe(val => console.log(val));
我不确定您是否也希望过滤第一个可见的5的倍数,但这很容易做到。您可以使用
多播
将源流拆分为两个,然后使用不同的过滤器
操作符再次合并它们
import { of, interval, Subject, merge } from 'rxjs';
import { bufferTime, multicast, filter } from 'rxjs/operators';
const buffered = source.pipe(
multicast(new Subject(), s => merge(
s.pipe(
filter((value: number) => value % 5 === 0),
),
s.pipe(
filter((value: number) => value % 5 !== 0),
bufferTime(4000),
),
))
);
您的最新演示: