1) Возможно, вам следует переместить эту строку в конструктор служб, в противном случае вы будете выдвигать второй массив фильмов по умолчанию каждый раз, когда вы getDefaultMoviesList
:
DEFAULT_MOVIES.map(movie => this.getMovieByTitle(movie).subscribe(item => this.moviesList.push(item)));
2) На самом деле вы должны merge
выводить каждый http.get
:
public getDefaultMoviesList(): Observable<{}> {
return merge(DEFAULT_MOVIES.map(movie => this.http.get<{}>(this.buildRequestUrl(movieTitle))
.pipe(retry(3),
catchError(this.handleError)
)))
}
3) На самом деле вы должны сделать это только один раз и сохранить его в BehaviorSubject
, чтобы не делать новый HTTP-запрос для каждого getDefaultMoviesList
private movies$: BehaviorSubject<any> = new BehaviorSubject<any>();
public getMovies$() {
return this.movies$.mergeMap(movies => {
if (movies) return of(movies);
return merge(DEFAULT_MOVIES.map(movie => this.http.get<{}>(this.buildRequestUrl(movieTitle))
.pipe(retry(3),
catchError(this.handleError)
)))
})
}
4) Ваша реализация вообще не должна работать, так как:
public getDefaultMoviesList(): Observable<{}> {
DEFAULT_MOVIES.map(movie => this.getMovieByTitle(movie).subscribe(item =>
this.moviesList.push(item))); // This line will happen after http get completes
return from(this.moviesList); // This line will happen BEFORE the line above
}
Таким образом, вы всегда будете возвращать Observable пустого массива.
5) Не следует использовать map
, если вы не хотите отображать свой массив в другой. Вы должны использовать forEach
вместо.
map
используется так:
const mappedArray = toMapArray.map(element => someFunction(element));