angular - 如何仅在第一个请求完成时触发新的 http 请求并忽略/取消其间的所有其他请求

标签 angular typescript httprequest rxjs

我正在使用 Angular2 制作 SPA 的前端,我有一个包含大量记录的数据库,而数据库本身非常慢,因此获取 10000 条记录(或仅使用 ORDER BY 的最后 10 条记录)占用到 4-5 秒。在我的情况下,升级数据库不是一种选择。

所以我想做的是:当用户多次点击分页器的“下一步”按钮(已经调用了 onNextClick)时(假设他连续点击了 100 次或更多次),只有第一个 http 请求会被发送到服务器/API。现在是我无法弄清楚的部分:

当第一个请求返回结果时,最后一个点击事件会触发一个新请求,忽略第一个和最后一个之间的所有其他点击请求(忽略的应该是请求,而不是点击本身)。然后,如果用户仍在点击,则最后一次点击/请求成为第一个,依此类推...

我尝试用 RxJS 做到这一点,但我只能通过使用间隔来做到这一点,所以如果间隔是 600 毫秒并且用户每 1000 毫秒点击一次,所有请求都会发送到服务器。这是我的代码:

 private clickStream = new Subject();

 ngOnInit() {
   this.clickStream
   .debounce(() => Observable.interval(600).take(1))
   .subscribe(
     params => {
       this.callHttpPostMethod();
     }
   );
 }

 onNextClick(event) {
     this.clickStream.next(event);
 }

欢迎使用任何 Angular2 解决方案 - 使用 RxJS 不是必需的。

最佳答案

您可以使用 switchMap 取消进行中的请求并确保只处理最新的请求。 :

this.clickStream
    .debounceTime(500)
    .switchMap(e=> this.callHttpPostMethod())
    .subscribe(t=> {
          ... do something ...
     });

关于angular - 如何仅在第一个请求完成时触发新的 http 请求并忽略/取消其间的所有其他请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42781602/

相关文章:

Angular 2 从 RxJs 订阅返回数据

javascript - 等待请求完成

javascript - 带有可选参数的 Typescript 构建 URL

angular-cli 和多个配置文件

angular - 蒙哥错误: user is not allowed to do action

Angular Routing 打开错误的组件

angular - Angular 中每条路线有多个组件

typescript - d.ts 中对 servicestack typescript 客户端的日期支持

post - 为什么 HttpRequest 发送 OPTIONS 动词而不是 POST?

angular - Spartacus - 从自定义 CMS 组件中检索数据