如何取消飞行中挂起的 http api 调用?

How to cancel in flight pending http api calls?

我的网页上有一个按钮,按下它会进行 http api 调用。获得响应并反映在页面中需要一些时间。那么有没有一种方法可以取消飞行中挂起的 http 请求,以避免多次 api 调用,以防用户多次按下它可能导致数据不一致?

为禁用的按钮创建属性。

isDisabled:boolean=false;

点击后变为true

this.isDisabled=true;

在订阅中获取数据后再次更改为 false

this.isDisabled=false;

在html中绑定到按钮

[disabled]="isDisabled"

您可以取消订阅请求:

@Component({ /* ... */ })
export class AppComponent {
  /* ... */
  private request;

  search() {
    if(request){
        request.unsubscribe();
    }

    this.request = this.searchService.search(this.searchField.value)
      .subscribe(
          //...
      );
  }
}

您是否考虑过不允许禁用按钮的场景。

问。那么接下来会发生什么?
A. 用户仍然可以按下按钮。

但在这种情况下,您不想进行第二次调用(考虑到第一次 API 调用尚未完成)。如果第一个调用正在进行,exhaustMap 会自动取消第二个调用。这就是 exhaustMap 的美妙之处。

对于这种情况 RXJS exhaustMap 很有用。

Read this nice article to understand it further

虚拟代码

fromEvent(this.saveButton.nativeElement, 'click')
    .pipe(
        exhaustMap(() => this.saveCourse(this.form.value))
    )
    .subscribe();

switchMap 可能会很方便,你有一个请求,突然第二个请求来了,所以它会取消第一个请求并开始第二个请求的过程。

fromEvent(this.saveButton.nativeElement, 'click')
        .pipe(
            swtichMap(() => this.saveCourse(this.form.value))
        )
        .subscribe();

这取决于适用于您的应用程序的场景。