Http返回的Observable每次异步管道订阅

时间:2017-06-27 09:47:55

标签: angular rxjs

所以我有这个方法返回一些可观察的。

fetch(publication: Publication): Observable<Array<ProcessingCenter>> {
  return this.http.get(`${BASE_URL}/api/publications/${publication.id}`, {
    headers: headers
  }).map(response => {
    return response.json() as Array<ProcessingCenter>;
  })
}

我存储返回值(getObservable总是返回相同的observable。)

在一个组件中,我在组件中使用了这个observable:

<tr *ngFor="let pc of getObservable(p) | async">
  ...
</tr>

现在,即使我总是使用相同的observable,当我切换组件时,每次创建和异步管道订阅时,都会发出一个AJAX请求。首次订阅完成后,AFAIK AJAX请求只应发出一次,对吗?

修改

感谢您的回答,但他们只是不关注真正的问题。让我改一下吧。

  1. 假设我有myObservable服务返回的可观察变量Http

  2. 假设在模板中我使用此变量与async管道

  3. 假设我正在使用简单async

  4. 切换使用*ngIf管道的模板的一部分

    E.g:

    <button (click)="toggle = !toggle">Toggle</button>
    <table class="table table-condensed" *ngIf="toggle">
      <!-- Somewhere in here is myObservable | async  -->>
    </table>
    

    现在,当我单击按钮时,每次切换表时,都会发送http请求(即使myObservable仍然是同一个可观察对象(组件的实例字段)。

    问题是:async管道或observable对Http服务返回的特殊之处是什么使得每次订阅时都会Http请求?

3 个答案:

答案 0 :(得分:3)

这是观察者工作的正常方式。每次观察者订阅时,都会执行它们为生成值而运行的逻辑(即触发http请求并等待其结果)。这些被称为cold可观察者。您可以使用hot使publish()个可执行逻辑一次的观察者使用hot。如果一个观察者在这样的观察者认可后发出了它的价值,它就什么也得不到。但是,在每个新订阅中,您可以拥有其他publishLast()可观察变体,这些变体将知道如何处理已经发出的值。请参阅publishBehavior()publishReplay()public string Name_A { get; set; } public LoginSalesDetails(string Username, string AgentNo, string AgentName, string AgentPhone, string AgentEmail, int AgentRating) { InitializeComponent(); accountname_label.Text = AgentName; agent_no_label.Text = AgentNo; rating_label.Text = "" + AgentRating; mobileno_label.Text = AgentPhone; email_label.Text = AgentEmail; Name_A = AgentName; // DisplayAlert("Alert ", ""+AgentName, "OK"); }

答案 1 :(得分:1)

您可以将publishLast与refcount一起使用。 publishLast是具有AsyncSubject的多播运算符,它将执行一次observable并记住。

类似的东西:

rows$ = Observable.of([1, 2, 3]).do(x => 
                   console.log(x)).publishLast().refCount();

答案 2 :(得分:-1)

你不需要担心它,因为浏览器知道你再次请求相同的资源,这已经存在于缓存中,所以浏览器在请求中添加标题说明,只有在新的时候给我内容,所以尽管请求是每次进行时,只有新服务器才能从服务器获取数据,否则只会获得304状态的空响应。

在后端进行适当的配置也可以避免这种重复的请求,这表明浏览器默认情况下可以将响应视为新的响应时间。

此链接说明https://www.linkedin.com/pulse/worried-making-repeated-requests-same-resource-slowing-akshay-jain/