буфер rxjs на основе предиката - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу сделать что-то, что я думаю должно быть довольно простым, но правильные операторы rxjs ускользают от меня.

Я хочу буферизовать наблюдаемые строки, очищая буфер, когданаблюдаемая производит соответствующую строку.Примерно так:

obs.pipe(magicBuffer(x => x === 'matching string'))

... для создания наблюдаемых массивов строк.

Все операторы буфера, которые я могу найти, кажутся буферизованными на основевторой наблюдаемый, а не исходный источник.

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать 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.log(x));

Демонстрационная версия: https://stackblitz.com/edit/rxjs-jad7ez

...