Есть несколько вариантов. Вот реактивный способ справиться с этим. В любое время, когда getPosts
будет успешным, вам нужно будет повторно получить исходные данные.
Чтобы получить исходные данные, вам нужно будет обернуть свои posts$
наблюдаемые в поток действий:
// create a stream for your post request
private readonly postAction$ = new Subject();
posts$ = this.postAction$.pipe(
startWith(''),
concatMap(()=> {
return this.postService.getPosts(); // this will be your http get request
}),
)
Оператор startWith
заставит ваш запрос get
первоначально сработать без того, чтобы наблюдаемое было передано вашей наблюдаемой postAction
.
Ваш метод getPosts
теперь будет вызывать this.postAction$.next()
в случае успеха, что вызовет повторное получение вашей posts$
наблюдаемой.
getPosts(): Observable<Posts[]> {
return this.http.post<Posts[]>(this.myAppUrl + this.myApiPostsUrl, this.authService.getLoggedUserFromSessionStorage())
.pipe(
retry(1),
catchError(this.errorHandler),
tap(() => this.postAction$.next())
);
}
Вы можете увидеть демо из этого. Проверьте консоль, вы увидите, что запрос get
запускается при каждом нажатии кнопки.
С интервалом
posts$ = interval(30000)
.pipe(
startWith(''),
switchMap(() => return this.postService.getPosts();)
)
Интервал демо