как вызвать что-то сразу, а затем отменить - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть видимая привязка к событию keyUp в поле ввода.

Для каждой нажатой клавиши.Я хочу console.log «Сделай что-нибудь сейчас».

И если в течение 5 секунд не будет нажата ни одна клавиша, я хочу, чтобы console.log «Сделай что-нибудь еще»

import { fromEvent } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs/operators';

const searchBox = document.getElementById('search');

const keyup$ = fromEvent(searchBox, 'keyup')

keyup$.pipe(
  switchMap((i: any) => 'doSomethingNow'), // I use switchMap here because 'doSomethingNow' is an http request in my real code so that on each key pressed, it cancels the previous http request if it was not finished and start the new http request
  debounceTime(2000),
  map(_ => 'do something else')
)
.subscribe(console.log);

ЭтоКод только печатать «сделать что-то после отказов» через 5 секунд, но никогда не печатать «DomethingNow» после каждого нажатия клавиши

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Вы можете использовать оператор слияния:

const searchBox = document.getElementById('search');

const keyup$ = fromEvent(searchBox, 'keyup');

const keyupEnd$ = keyup$.pipe(
  switchMap(() => debounceTime(500))
);

const result = merge(
  keyup$,
  keyupEnd$
);
0 голосов
/ 28 сентября 2019

Вы пробовали что-то вроде:

import { fromEvent } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs/operators';

var searchBox  = document.getElementById('search');

var keyup$ = fromEvent(searchBox , 'keyup')      

keyup$.pipe(
  switchMap((i: any) => { console.log('do something');})
  debounceTime(5000)) // with delay of 5 secs
  .subscribe(console.log('do something else'););
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...