Я хочу сделать что-то, что я считать должен быть довольно простым, но правильные операторы rxjs ускользают от меня.
Я хочу буферизовать наблюдаемую строку, очищая буфер, когда наблюдаемая создает совпадающую строку. Что-то вроде этого:
obs.pipe(magicBuffer(x => x === 'matching string'))
... для создания наблюдаемого массива строк.
Все операторы буфера, которые я могу найти, похоже, буферизуются на основе второго наблюдаемого, а не исходного источника.


![Подсказка RxJS [filter, skipWhile]](https://i.imgur.com/QlvZflrb.jpeg)

Вы можете использовать multicast для разделения исходного Observable, а затем просто buffer, пока он не выдаст совпадающую строку.
Это разделит исходные выбросы по характеру '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.info(x));
Живая демонстрация: https://stackblitz.com/edit/rxjs-jad7ez
Если мне нужно будет написать оператор, я это сделаю. Было бы очень просто написать. Но вместо этого я использую канонический подход к этой проблеме, если он есть.