Как игнорировать / прерывать все предыдущие асинхронные вызовы, принимать только последний?

#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)
  })
}