如何忽略/中断所有先前的异步调用,仅接听最后一个?

时间:2019-04-17 19:19:24

标签: angular rxjs observable

如果开始新的通话,我想忽略/断开所有以前的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 个答案:

答案 0 :(得分: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)
  })
}