Это не API. Почему я уверен в этом? Потому что вы используете Angular HttpClient, и вам нужно немало шаблонов, чтобы сделать несколько запросов. Ваша проблема в том, что ваша страница отображается несколько раз , в то время как отображаемое Angular управляет макетом страницы.
Реальная проблема заключается в этой строке:
<p *ngFor="let a of getdata()">{{a}}</p >
Каждый раз, когда эта строка обрабатывается angular вызывает getdata()
отправку другого запроса.
Вы должны отделить список результатов от запрашивающей его функции. Из вашего кода кажется, что ata
является Observable
. Должно работать что-то вроде следующего:
<p *ngFor="let a of ata | async">{{a}}</p>
Обратите внимание, что используется async
труба.
Из Angular документации
Канал async
подписывается на Observable
или Promise
и возвращает последнее значение, которое он испустил. Когда создается новое значение, труба async
отмечает компонент, который необходимо проверить на наличие изменений. Когда компонент уничтожается, канал async
автоматически отписывается, чтобы избежать возможных утечек памяти.
Конечно, вы должны вызвать getdata()
где-нибудь, и обычно правильное место находится в ngOnInit()
.
Примечание: Как получить только один ответ от подписки Observable
Поскольку в этом вопросе возникает путаница в этой теме c, если вам нужно получить только один ответ из Observable распространенным способом является использование оператора take
.
import { take } from 'rxjs/operators';
[...]
someService.getObservable(...)
.pipe( take(1) ) // <-- take first response
.subscribe( (r) => { ... } );