Было сделано 3 запроса, потому что код указывает 3 асин c канала для this.webProtectionHTML$
в шаблоне.
У вас есть два решения:
1. Используйте одиночный асин c канал в шаблоне
Используйте ngIf
и установите асин c канал с псевдонимом as
в условии
<div *ngIf="webProtectionHTML$ | async as webProtection"> // define async here
<div class="tr">
<div class="align-left">Phishing & Other Frauds</div>
<div class="align-right">{{ webProtection.phishing}}</div>
</div>
<div class="tr">
<div class="align-left">Spam URLs</div>
<div class="align-right">{{ webProtection.spamURLs}}</div>
</div>
<div class="tr">
<div class="align-left">Malware Sites</div>
<div class="align-right">{{ webProtection.malware}}</div>
</div>
</div>
2. Используйте shareReplay () rx js operator Оператор используется для воспроизведения предыдущих данных для всех подписчиков. shareReplay(1)
означает, что воспроизводятся последние данные.
this.webProtectionHTML$ = this.dayService$
.pipe(
mergeMap((days: DaysPeriod // params added to request url) => this.httpClient.get(`api/data_processor_classlib.php....`//request url, { responseType: 'text' })),
map((html: string) => {
//get html code and find data return as json data
let result = this.getWebProtectionData(html)
return result
})),
shareReplay(1)
Оба работают, но если я могу выбрать для этого случая, мне нравится первое решение.
Надеюсь, это поможет