I have Angular input where every time its value changes I ask service to get some data about entered value. I only care about last entered input, so when user enters '1', but then erases it and enters '2' I don't care about data about previous value. I wrote something like this (I keep value of previous request in prevNr):
let stream,
nr = document.querySelector('input').value;
if (status === `${nr} in progress`) {
stream.unsubscribe();
console.log(`subscription of ${prevNr} cancelled`)
}
status = 'in progress';
prevNr = nr;
console.log(`started subscription of ${nr}`)
stream = someService.someMethod.subscribe(() => {
const clonedNr = nr;
setTimeout(() => {
status = 'done';
console.log(`received response for ${clonedNr}`)
}, 12000);
})
What I get back in console is
1 in progress
subscription of 1 cancelled
2 in progress
subscription of 2 cancelled
3 in progress
subscription of 3 cancelled
4 in progress
received response for 1
received response for 2
received response for 3
received response for 4
Right now I mock response by setTimeout(), but I can imagine situation where I receive data for input 4 before data for input 3 and as result this data will be assigned to wrong input. How can I omit previous requests in Observable? Is that possible?