如何使用一些谓词拆分流

时间:2016-07-13 19:52:53

标签: reactive-programming rxjs

Here编写了如何通过某些边界标记将流拆分为多个流。它由.window.filter完成。

in      a-b-c-X-d-e-f-g-h-X-i-X-j-k-l-m-n-
out v   a-b-c-X
    v          -d-e-f-g-h-X
    v                      -i-X
    v                          -j-k-l-m-n-

但是如何在边框标记之前拆分流?像这样:

in      a-b-c-X-d-e-f-g-h-X-i-X-j-k-l-m-n-
out v   a-b-c
    v         X-d-e-f-g-h
    v                     X-i
    v                         X-j-k-l-m-n-

1 个答案:

答案 0 :(得分:1)

您所指的答案实际上并不包括任何输出流中的标记,只包括它们之间的项目。正如用户3743222在评论中所建议的那样,如果你想在输出流中使用它们,你可以简单地将它们放回去。像这样:

const marker = 'X';
const [ incisions, items ] = input.partition(x => x === marker);
const streams = items.window(incisions);
const first = streams.take(1);
const rest = streams.skip(1);
const whatYouWant = first.concat(rest.map(x => Rx.Observable.just(marker).concat(x)));

然而,window的一个较少使用的重载实际上能够直接执行此操作:

const closing = input.filter(x => x === 'X').share();
const opening = Rx.Observable.just(null).concat(closing);
const streams = input.window(opening, () => closing);