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 интервал?