angular - trigga observable några millisekunder efter att ha slutat skriva i textfältet


Jag använder Angular4 och RxJS

Grundläggande antagande är att: när användaren anger en enstaka bokstav i textfältet triggar jag någon getData()-funktion (keyup-händelse), hämtar datan och visar den under textfältet

Jag skulle vilja att funktionen inte triggas och att datan inte hämtas direkt efter att användaren skriver en bokstav, utan låta honom skriva en hel fras, vänta till exempel 300 millisekunder och slutligen trigga funktionen, hämta datan och visa den

så flödet jag skulle vilja uppnå är liknande detta:

myService.getDataAsObservable
.whatToDoHere?
.subscribe(data => ...handle and display the data...);

En lösning är att slå in allt i setTimeout(), men det skulle vara mycket bättre att göra det smidigt i en observables-stil

Jag har en gång sett lösningen på det problemet, men kan inte hitta den igen..

tack!

Svar #1

Du kommer att behöva använda debounce-operatorn:

myService.getDataAsObservable
.debounce(300)
.subscribe(data => ...handle and display the data...);

Här är den visuella förklaringen:

var someObservable = getDataAsObservable('---x---x---x---|');
var someDuration = 300;  //                              '--------|';
var expected =            '---------------------------------------x---|';