如何:使用异步管道时重新发送http请求

时间:2019-05-17 13:38:31

标签: angular rxjs

在这样的模板中使用异步管道时,是否可以重新发送HttpRequest?

myObservable$ = this.http.get('api');
<div *ngFor='let item of myObservable$ | async'>{{item}}</div>

3 个答案:

答案 0 :(得分:2)

使用async管道是处理Observables的一种非常方便的方法,因为它可以为您管理退订。这意味着,如果myObservable$引用发生更改,将触发ChangeDetection,并且async将取消订阅当前订阅并订阅另一个订阅。因此,您只需重新分配新值myObservable$HttpRequest就会再次发送。

自己测试一下:

ngOnInit() {
  setTimeout(() => this.myObservable$ = this.http.get('another-endpoint'), 2000)
}

答案 1 :(得分:1)

您需要向Observable发出新值,如果您需要按特定事件重新获取数据,则可以将事件放入Observable并使用switchMap进行触发器提取:

event$ = new BehaviorSubject(true);

myObservable$ = this.event$.pipe(
  switchMapTo(this.http.get('api'))
);

refetchData() {
  this.event$.next();
}

答案 2 :(得分:0)

这不是最佳实践。异步管道旨在与流一起使用,将其与触发器可观察对象(例如http调用)一起使用可能会产生有害的副作用。我建议将http调用放在服务中,然后订阅您的组件。如果有特定的原因想要使用异步管道,我建议您使用一个单独的BehaviorSubject并执行类似的操作。...

df <- read.table(
  header = T,
  stringsAsFactors = F, sep = "|",
  text = "Datetime            | Group | Value
2019-01-01 00:00:00 |  1    |  5  
2019-01-01 00:00:00 |  2    |  4    
2019-01-01 00:00:00 |  3    |  2     
2019-01-01 00:01:00 |  1    |  1  
2019-01-01 00:02:00 |  1    |  2     
2019-01-01 00:02:00 |  2    |  2    
2019-01-01 00:02:00 |  3    |  1    
2019-01-01 00:03:00 |  1    |  1    
2019-01-01 00:03:00 |  2    |  2    
2019-01-01 00:04:00 |  1    |  1"
) 
df$Datetime = lubridate::ymd_hms(df$Datetime)

然后,您可以在组件中每次想要进行http调用时都订阅此内容,在html模板中,可以使用异步管道订阅myBehaviorSubject $。