#angular #rxjs #observable
#angular #rxjs #наблюдаемый
Вопрос:
Я хочу игнорировать / прерывать все предыдущие http-вызовы, если начался новый вызов. Например.:
data: string;
updateDataById(id: number) {
this.http.get('url', {params: {id}}).subscribe(response => this.data = response);
}
ngOnInit() {
// First call, it will takes 3s, response will be 'cat'.
this.updateDataById(8);
// Second call, but it will take only 1s, response will be 'dog'.
this.updateDataById(46);
}
В этом случае значение данных будет «dog» в первый раз, затем оно изменится на «cat» позже, потому что время отклика первого вызова больше, чем время отклика второго вызова.
Как данные могут быть «собачьими» первыми и последними?
Ответ №1:
Вы можете использовать switchMap
оператор, но из вашего примера я не уверен, как вы вызываете изменение. Суть этого:
// Start the "faster" request
of(fakeHttp()).pipe(
// Switch to the this observable, cancelling the previous.
switchMap(() => fakeHttp(true))
).subscribe(console.log); // 'cat' is never output
function fakeHttp(long = false) {
return new Promise(resolve => {
console.log('Faking', long) // First outputs 'cat', then 'dog'
setTimeout(() => {
resolve(long ? 'dog' : 'cat')
}, long ? 2000 : 200)
})
}