我有一个事件流,我希望根据事件可能具有的某些属性将其拆分为多个流。类似于以下内容
SetUnhandledExceptionFilter()
修改
感谢您提供有关let streams = new rx.Subject()
let stream = new rx.Subject()
input.subscribe((x) => {
stream.onNext(x)
if (!x.splitHere) return
streams.onNext(stream)
stream = new rx.Subject()
})
和partition
的提示。虽然他们将一个流分成多个,但它们只提供两个结果流。
澄清 我需要做的是将一个流切割成可变数量的流,切口点由谓词定义。
if
答案 0 :(得分:3)
window
这样做。
const streams = input
.filter(x => x !== 'X')
.window(input.filter(x => x === 'X'));
使用partition
和数组解构,你可以得到(在我看来)读得非常好的东西:
const [ incisions, items ] = input.partition(x => x === 'X');
const streams = items.window(incisions);
答案 1 :(得分:0)
是的,有一个名为partition
的运营商:
const source$ = Rx.Observable.from([{ a: 'value' }, { b: 'value' }]);
const [hasA$, doesNotHaveA$] = source$.partition(x => Boolean(x.a));
通常,如果要派生满足某些条件/谓词的流,最好的方法是使用filter
运算符:
const hasA$ = source$.filter(x => Boolean(x.a));
const satisfiesOtherCriteria$ = source$.filter(somePredicate));
答案 2 :(得分:0)
假设你指的是分裂(即你从一个流中得到几个流),你在这里对这个问题有一个非常好的和彻底的处理:RxJS modeling if else control structures with Observables operators
以下是摘要:
您可以使用几个运算符来模拟它:
按照你最想要的顺序排列:
链接中提供了代码示例。
如果您指的是过滤(从一个流中获取一个流但跳过某些值),那么filter
运算符是您最好的选择。还有其他运营商可以进行某种过滤,例如distinct
或distinctUntilChanged
,skip
等。