объединить потоки с rxjs (с картой переключения и взять) - PullRequest
0 голосов
/ 03 июля 2018

У меня есть 2 потока, от событий клавиатуры (K) и от событий мыши (M). События клавиатуры должны генерироваться, когда предыдущее событие было нулевым или событие мыши. События мыши должны создаваться, когда предыдущее событие было событием клавиатуры.

Таким образом, отправляя M-K-M-K-K-M-K-K, следует 3 раза вызвать обработчик клавиатуры и 2 раза обработчик мыши.

Следующая подписка позволяет потоку клавиатуры генерировать несколько событий клавиатуры, а это не то, что мне нужно.

keyboardStream(document)
        .do(keyboardHandler)
        .switchMap(() => mouseStream(document).take(1))
        .subscribe(mouseHandler)

1 Ответ

0 голосов
/ 07 июля 2018

Я закончил с:

const keyboard$ = fromEvent(document, 'keyup')
.pipe(
    mapTo('k')
);

const mouseOnce$ = fromEvent(document, 'keyup')
    .pipe(
        switchMap(() => fromEvent(document, 'mousedown').pipe(first())),
        mapTo('m')
    );

const stream = merge(
    mouseOnce$,
    keyboard$
).pipe(distinctUntilChanged());
...