是否有更通过某种谓词拆分流的思想方式?

时间:2016-03-17 15:59:04

标签: reactive-programming rxjs

我有一个事件流,我希望根据事件可能具有的某些属性将其拆分为多个流。类似于以下内容

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

3 个答案:

答案 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运算符是您最好的选择。还有其他运营商可以进行某种过滤,例如distinctdistinctUntilChangedskip等。