@sanex3339

RXJS и Merge 2 последовательностей значений. Как правильно сделать?

https://plnkr.co/edit/zO3gpQoxnnA2KwZBtKJB?p=preview

Файл DumbInput.ts

Есть инпут. Keyup и blur эвенты инпута в виде Observable последовательностей я мерджу в одну Observable общую последовательность.

Идея такова:
- при keyup эвенте мы отдаем значение с задержкой в 1000мс.
- при blur эвенте, если значение инпута пустое - мы отдаем дефолтное значение

Если после keyup, но до момента отстукивания значения, т.е. в промежуток в 1000мс, совершится blur эвент - keyup эвент должен прекратиться и не вызываться до нового keyup эвента.

И вот с последним как раз проблема. Если в момент после keyup, во время debounce интервала, произойдет blur эвент - в этот самый момент произойдет отстукивание keyup значения и тут же отстукивание blur значения. В демо примере это будет видно в консоле.

Как воспроизвести:
ввести что-то в инпут, затем менее чем за 1 сек кликнуть ВНЕ инпута - в консоле сработают оба сабскрайбера: вначале на keyup и тут же затем на blur

Код:
let blur$: Observable<string> = this.blur$
            .filter(value => value === '')
            .map(value => this.defaultValue);

        let keyup$: Observable<string> = this.keyup$
                .takeUntil(blur$)
                .distinctUntilChanged()
                .debounceTime(1000)
                .repeat();

        this.outputValue = Observable.merge(
            keyup$,
            blur$
        );

        keyup$.subscribe(e => console.log('keyup', e));
        blur$.subscribe(e => console.log('blur', e));


Как сделать так, что бы отстукивания keyup не срабатывало после takeUntil? Почему takeUntil не отменяет keyup debounce интервал?
  • Вопрос задан
  • 380 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы