Как указывает user1986938, ваша проблема в том, что ваш вызов API является асинхронным, и вы должны ждать, пока ответ API сможет что-то сделать с вашими данными.
В Angular
вы можете легко сделать это, полагаясь нав RxJs библиотеке, с которой Angular
тесно связана.
Вот рабочий пример , который вы можете легко адаптировать к вашему делу.
Вы можете видеть, что в этом примере я использую ReplaySubject
, потому что он может снова предоставлять значение любому новому подписчику, даже после того, как ваш вызов API завершен.
Конкретно, это позволяет вам запрашивать список всех ваших проектовиз вашего ProjectService
несколько раз и, возможно, из разных частей вашего приложения, без необходимости выполнять реальный вызов API более одного раза и без заботы о чем-либо еще.
Если вы не знакомы с ReactiveX
концепции, я предлагаю вам прочитать эту замечательную документацию , а для вашего случая это part , что составляет примерно Subjects
.
компонент
export class AppComponent
{
// this property allows passing projects to your template
projects: string[];
// you can directly inject your service into your component constructor
constructor ( private projectService: ProjectService )
{
// here you subscribe to you projects query observable
this.projectService.getAll().subscribe(projects =>
{
// now you can do what you want with your projects
console.log('projects: ', projects);
// here, we store projects in component property to display them in template
this.projects = projects;
});
}
}
сервис
export class ProjectService
{
// this property is used to store your API response
private projectsSubject: ReplaySubject<any>;
constructor ()
{
// create subject
this.projectsSubject = new ReplaySubject();
// do API call
this.doFakeAPICall().subscribe(projects =>
{
// store response as subject value
this.projectsSubject.next(projects);
});
}
getAll (): Observable<any>
{
// return subject as observable
return this.projectsSubject.asObservable();
}
// replace this be your real API call
private doFakeAPICall (): Observable<any>
{
// here we simulate a response delay of one second
return of([ 'project 1', 'project 2' ]).pipe(delay(1000));
}
}