基于谓词的rxjs缓冲区

基于谓词的rxjs缓冲区,rxjs,observable,buffer,Rxjs,Observable,Buffer,我想做一些我认为应该非常简单的事情,但是正确的rxjs操作符却让我难以理解 我想缓冲一个字符串的可观察对象,当可观察对象生成匹配字符串时刷新缓冲区。大概是这样的: obs.pipe(magicBuffer(x=>x===“匹配字符串”) …生成一组可观察的字符串数组 我能找到的所有缓冲区操作符似乎都是基于第二个可观察的,而不是原始源进行缓冲。您可以使用多播分割源可观察的,然后只缓冲,直到它发出匹配的字符串 这将按'x'字符分割源排放 import { of, Subject } from 'rx

我想做一些我认为应该非常简单的事情,但是正确的rxjs操作符却让我难以理解

我想缓冲一个字符串的可观察对象,当可观察对象生成匹配字符串时刷新缓冲区。大概是这样的:

obs.pipe(magicBuffer(x=>x===“匹配字符串”)

…生成一组可观察的字符串数组


我能找到的所有缓冲区操作符似乎都是基于第二个可观察的,而不是原始源进行缓冲。

您可以使用
多播
分割源可观察的,然后只
缓冲
,直到它发出匹配的字符串

这将按
'x'
字符分割源排放

import { of, Subject } from 'rxjs'; 
import { filter, buffer, multicast } from 'rxjs/operators';

const source = of('a', 'b', 'c', 'x', 'd', 'x', 'e' , 'f', 'g', 'h', 'i', 'j', 'k', 'x', 'l', 'm');

source.pipe(
  multicast(
    () => new Subject(),
    s => s.pipe(
      filter(v => v !== 'x'),
      buffer(s.pipe(filter(v => v === 'x'))),
    )
  )
).subscribe(x => console.log(x));

现场演示:

如果我必须编写操作员,我会。写起来会很简单。但是我宁愿使用规范的方法来解决这个问题,如果有的话。