【问题标题】:Typescript Angular HTTP request get only last resultTypescript Angular HTTP请求仅获得最后一个结果
【发布时间】:2018-10-23 21:06:42
【问题描述】:

确保我的 Angular HTTP 请求仅返回最新响应数据的“最佳”(常用)方法是什么。 (我正在使用 Angulars HttpClient)

假设用户在返回前一个请求的响应之前提交了一个新请求。我的后端需要更多时间来处理第一个请求,因此第二个请求在第一个请求之前返回 -> 视图获取更新,稍后第一个请求返回。现在视图会使用旧数据进行更新。这显然不是我想要的。

我找到了取消请求的解决方案,但这真的是唯一的方法吗?是否有任何内置功能可以实现这一目标?

if ( this.subscription ) {
   this.subscription.unsubscribe();
}
this.subscription = this.http.get( 'myAPI' )
 .subscribe(resp => {
  // handle result ...
});

我知道有 switchMap() 运算符只返回最新数据,但据我所知,您只能在可观察对象中使用它。就我而言,我没有观察到任何输入变化。我只是通过 HTML-Template 中的 (ngSubmit)="doRequest()" 指令调用表单提交上的函数。

// get called on submit form
doRequest() {
 this.http.get('myAPI')
  .subscribe(resp => {
    // handle result ...
  });
}

有没有办法使用 switchMap 操作符或者你有其他解决方案吗?感谢您抽出宝贵时间:)

PS:当然,在我的实际项目中,我有一个 api 服务类,它具有不同的功能来执行请求并仅返回 http 响应 observables。所以我在 doRequest() 函数中订阅了这样一个 observable。

【问题讨论】:

    标签: javascript angular typescript rxjs httpclient


    【解决方案1】:

    您只需将点击/请求设置为可以关闭的流...用户的请求/点击是您可以观察和响应的事件流。

    private requestSource = new Subject();
    
    request() {
      this.requestSource.next();
    }
    
    ngOnInit() {
      this.requestSource.switchMap(req => this.http.get('myApi'))
                           .subscribe(response => console.log(response, "latest"));
    }
    

    现代客户端编程经验法则:一切都是流,即使它看起来不像一个流。

    编辑:如果是 rxjs 6 或最新版本,请在上面的代码中添加pipe 运算符。

    this.requestSource.pipe(switchMap(...));
    

    【讨论】:

    • 我只需要添加管道运算符,因为我使用的是 rxjs 6。所以this.requestSource.pipe(switchMap(...)); 为我工作。谢谢!
    • 我发现这样做有问题。如果我的服务器请求失败并且我的 http observable 返回一个错误,调用 this.requestSource.next(); 将不再执行任何操作。有解决办法吗?
    • 您需要使用 subscribe 方法中的错误处理程序或 catch 运算符来处理您的错误
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多