Внутри getConfigurations
вы вызываете асинхронный HTTP-запрос.Так что это нормально, что configurationsData
пусто вне метода subscribe
.
Здесь я использую мощный из RxJS , чтобы упростить код и избежать использования Array.push
и вложенный subscribe()
.
1) Базовый метод асинхронной службы для получения данных
Поэтому getConfigurations
должен возвращать Observable
:
getConfigurations(): Observable<string[]> {
return this.http.get<string[]>(this.configuration);
}
А также getBlogs
должен возвращать Observable
:
getBlogs(blogsPath: string): Observable<BlogPost[]> {
return this.http.get<BlogPost[]>(blogsPath);
}
Здесь, в соответствии с рекомендациями Angular, я удаляю I
в начале каждого интерфейса, поэтому BlogPost
.
2) Вот волшебство RxJS
Затем у вас есть другой метод в вашем сервисе для получения Observable
сообщений в блоге, который должен выглядеть следующим образом:
getBlogPosts(): Observable<BlogPost[]> {
return this.getConfigurations().pipe(
mergeAll(),
concatMap(blogsPath => this.getBlogs(blogsPath)),
concatAll(),
toArray()
)
}
Что означает, получить всю коллекцию путей к блогам, для каждого массива путей, для каждого пути, получить сообщения в блоге, а затем вернуть уникальный массив всех сообщений.
Наконецвнутри вашего компонента вы звоните getBlogPosts
с подпиской:
ngOnInit() {
this.service.getBlogPosts().subscribe(blogs => {
...do something with your blogs array.
});
}
или даже лучше с async
трубой внутри вашего шаблона:
.ts файл:
blogs$: Observable<BlogPost[]>;
...
this.blogs$ = this.appService.getBlogPosts();
.html файл:
<ul *ngIf="blogs$ | async as blogs">
<li *ngFor="let blog of blogs">
#{{ blog.id }} - {{ blog.title }}
</li>
</ul>
Проверьте мою полную демонстрацию этой альтернативы RxJS на Stackbliz.
Рекомендуется прочитать на носителе от Томаса Траяна