在发出其他可观察值之前不发出,然后再发出所有先前的值

时间:2020-02-17 23:18:12

标签: rxjs

我正在寻找一种缓冲可观察值的方法,直到发出其他一些可观察值,然后再发出所有先前的值。类似skipUntil之类的东西,如果skipUntil也会在发出第二个可观察值时立即发出跳过的值。

--a--b----c-----d---e--- (source)
-----------1------------- (other1)
------------abc-d---e----(desired output)

2 个答案:

答案 0 :(得分:0)

您可以使用bufferWhen

import { fromEvent, interval } from 'rxjs';
import { bufferWhen } from 'rxjs/operators';

const clicks = fromEvent(document, 'click');
const buffered = clicks.pipe(bufferWhen(() =>
  interval(1000 + Math.random() * 4000)
));
buffered.subscribe(x => console.log(x));

答案 1 :(得分:0)

这是我想到的自定义运算符。不确定是否可以通过更漂亮的方式完成。

export function bufferUntil(stopBufferSignal: Observable<any>) {
    return <T>(source: Observable<T>): Observable<T> => {
        return source.pipe(buffer(stopBufferSignal),
            take(1),
            flatMap(ar => {
                const sourceWithNSkipped$: Observable<T> = source.pipe(skip(ar.length));
                const bufferedItems$: Observable<T> = from(ar);
                return bufferedItems$.pipe(concat(sourceWithNSkipped$))
            }));
    }
}