所以我有这个方法返回一些可观察的。
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请求只应发出一次,对吗?
感谢您的回答,但他们只是不关注真正的问题。让我改一下吧。
假设我有myObservable
服务返回的可观察变量Http
假设在模板中我使用此变量与async
管道
假设我正在使用简单async
*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
请求?
答案 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/