【发布时间】:2018-07-11 11:07:42
【问题描述】:
我正在使用HTTPClient 发出post 请求,但是当我subscribe 到HTTPClient 返回的observable 时遇到了非常奇怪的行为:对于每个subscription,我得到一个post要求。意思是,如果我 subscribe 到 observable 5 次,我会收到 5 个 post 请求。太诡异了!
我正在我的 serverService 中发出以下请求:
makePostReq<T>(reqObj: {url:string, body:any, headerData?:any}): Observable<T>{
let headers = this.createHeaders(reqObj.headerData);
reqObj.body, {headers:headers});
return this.httpClient.post<T>(reqObj.url, reqObj.body, {headers:headers});
}
在我的组件中,我调用makePostReq 如下:
overviewInfo$: Observable<IOverviewInfo>;
ngOnInit() {
this.getOverviewInfo();
}
getOverviewInfo() {
console.log('getOverviewInfo...');
let url = this.constantsService.getOverViewInfoUrl();
let body = {
bot_id: this.bot_id,
platform: this.selectedChannel,
start_date: this.start_date,
end_date: this.end_date
};
this.overviewInfo$ = this.serverService.makePostReq({url, body});
/*=== Now if I subscribe to overviewInfo 5 times, I will have 5 post request=== */
this.overviewInfo$.subscribe((value) => {
console.log(value);
});
this.overviewInfo$.subscribe((value) => {
console.log(value);
});
this.overviewInfo$.subscribe((value) => {
console.log(value);
});
this.overviewInfo$.subscribe((value) => {
console.log(value);
});
this.overviewInfo$.subscribe((value) => {
console.log(value);
});
}
截图:
编辑:
实际上,我不会多次订阅。相反,我在我的模板中使用了(overviewInfo$|async) 5 次,这与调用POST 5 次具有相同的效果。我用多个subscribe 询问了这个问题,以减少async 管道的不必要的复杂性。
【问题讨论】:
-
当然可以。这就是订阅应该做的事情。你可以在很多地方订阅一个 Observable,一旦 POST 完成,它们都会被调用。您的 POST 没有被调用 5 次,来自 POST 调用的响应被发送到所有订阅的回调,即在您的情况下为 5。
-
@KaushikEvani Post 被调用了 5 次。我可以在网络选项卡中看到。我也可以附上截图。
-
是的......我也通过自己的搜索找到了与以下相同的答案。显然这是 Observables 的设计。查看此angular issue 以及有关它的一些讨论。
-
@KaushikEvani 感谢您的链接。但是如果每个订阅都重新执行整个事情,人们如何使用异步管道(多次)?
-
您应该只在模板中使用一次
async管道see this example
标签: angular observable