javascript - Angular 4 : abort all pending $http requests on route change

标签 javascript angular

我有一个DataService,例如:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';

@Injectable()
export class DataService {

  constructor(private http: Http) {}

  getData(): Promise<any[]> {
    return this.http.get('/api/data')
      .toPromise()
      .then(response => {
        const js_res = response.json();
        if ( js_res.data ){
          return js_res.data as any[];
        } else {
          throw new Error(js_res.info || response.text); 
        }
      })
      .catch( err => { console.log(err); });
  }
}

DataService在每个路由中被调用多次。当用户更改路由时,很多请求可能处于待处理状态,我想中止旧路由的所有待处理请求。

我是 Angular 4 的新手,正确的方法是什么?

最佳答案

因此,您已经设置了数据服务,并且您的方法 getData() 无论您在何处调用它,都会发出 http 请求。

假设您在 HeroListComponent 内调用此方法。该组件有一些生命周期方法,其中之一是 onNgDestroy,您可以使用它来执行取消逻辑。当您离开此组件时,Angular 将自动调用此方法。

因此,在 HeroListComponent ngOnInit 方法中,您进行 HTTP 调用,并在 ngOnDestroy 中取消订阅。我没有测试代码,但由于您将 Observable 转换为 DataService 内的 Promise,我不确定您是否仍然可以取消订阅。如果它不起作用,则只有在将引用保存在组件 ngOnInit 中(例如 this.dataSubscription = this.dataService.getData())之后,才必须将 Observable 转换为 Promise。 toPromise()...,但最佳实践仍然是尝试理解 Observables 并避免将它们转换为 Promise,因为你会失去太多的力量。

class HeroListComponent implements OnInit, OnDestroy {
  constructor(private dataService: DataService) {}

  ngOnInit() {
    this.dataSubscription = this.dataService.getData();
  }

  ngOnDestroy() {
    this.requestSubscription.unsubscribe();
  }
}

关于javascript - Angular 4 : abort all pending $http requests on route change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46149941/

相关文章:

javascript - 'this'在javascript函数中意味着什么?

angular - 如何以编程方式实例化和应用指​​令?

javascript - Angular Material 样式类不起作用

javascript - 使用slideUp/slideDown 从最后一张幻灯片到第一张幻灯片

javascript - 更改图像单击上的选择框选择

javascript - 检测到多个事件,其中应该只有一个

angular - 如何解决 nginx 上的 404 错误?

Angular 异步验证器 FormControls 在模糊之前不会更新

html - 在 html 元素上只允许点击事件一次

javascript - Twitter Bootstrap 工具提示数据选择器?