Javascript Rxjs from()运算符不发送数据

Javascript Rxjs from()运算符不发送数据,javascript,angular,rxjs,ngrx,Javascript,Angular,Rxjs,Ngrx,我在Angular/rxjs/Ngrx上有一个简单的应用程序,它从api请求默认电影列表 组件技术 导出类MoviesComponent实现OnInit{ 私人电影$:可观察= this.store.selectfromRoot.getMoviesState; 私人电影=[]; 构造函数公共存储:存储{} 恩戈尼特{ this.store.dispatchnew MoviesApi.RequestMovies; this.movies$.subscribefilm=>this.films.pus

我在Angular/rxjs/Ngrx上有一个简单的应用程序,它从api请求默认电影列表

组件技术

导出类MoviesComponent实现OnInit{ 私人电影$:可观察= this.store.selectfromRoot.getMoviesState; 私人电影=[]; 构造函数公共存储:存储{} 恩戈尼特{ this.store.dispatchnew MoviesApi.RequestMovies; this.movies$.subscribefilm=>this.films.pushfilm; console.logthis.films } 特效

@影响 requestMovies$:Observable=this.actions$ 管 ofTypeMoviesApi.REQUEST\u电影, switchMapactions=>this.MoviesApiServ.getDefaultMoviesList 管 mergeMapmovies=>的新电影API.ReceiveMoviesMovies, catchErrorerr=>{ console.log'err',err; 返回新电影API.RequestFailederr; } ; 服务台

出口级电影制作服务{ 私人电影列表=[]; 构造函数私有http:HttpClient{} 公共getDefaultMoviesList:可观察{ 默认_MOVIES.mapmoine=>this.getMovieByTitlemovie.subscribeetem=>this.moviesList.pushitem; 从this.moviesList返回; } publicGetMovieByTitleMovieTitle:string:可观察{ 返回this.http.getthis.buildRequestUrlmovieTitle .管道3, 接球手 ; } } 默认的电影只是带有标题的数组

因此,我的getDefaultMoviesList方法没有发送数据。但是,如果我将this.moviesList替换为硬编码的值数组,它将按预期工作。 我做错了什么

UPD
我想循环查看默认的电影列表,然后调用每个电影的getMovieByTitle,将它们收集在数组中并作为可观察的电影发送。有没有更好的解决方案?

您可以尝试使用of操作符创建可观察的电影

例:这是电影列表

需要注意的一个有趣的事实是,当您订阅Observable.of[]时,它将是一个空数组。当您订阅Observable.from[]时,它将不会得到任何值


Observable.of是Observable上的一个静态方法。它为您创建一个Observable,它会立即一个接一个地发出您指定为参数的值,然后发出一个完整的通知。

1您可能应该将此行移动到服务构造函数,否则每次启动时都会推送第二个默认电影数组getDefaultMoviesList:

2实际上,您可能应该合并每个http.get的输出:

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
}
因此,您将始终返回一个可观测的空数组

5如果不想将数组映射到另一个数组,则不应使用map。应使用forEach

地图是这样使用的:


const mappedArray=toMapArray.mapeElement=>someFunctionelement;

是否尝试返回this.moviesList;有趣的事实是可观察的。订阅时,[]的of将是一个空数组。其中,订阅Observable.from[]你不会得到任何值。@nircraft,我想循环查看默认的电影列表,然后调用每个电影getMovieByTitle,将它们收集到数组中并作为可观察的内容发送。是否有更好的解决方案?是的,我尝试了,但什么都没有发生。是的,你可以这样做:const apicall=[];default\u MOVIES.forEachmovie=>{apiCalls.pushthis.getMovieByTitlemovie;};Observable.forkJoinapiCalls.SubscriberResponses=>{…}@nircraft,这很奇怪,但我再次尝试了,现在它的效果如预期。非常感谢!现在我可以接受你的回答,很高兴它有帮助。这如何回答问题?每次只会发出一个空数组。of一点都没有帮助。你可以用返回[]来替换整个服务
  public getDefaultMoviesList(): Observable<{}> {
    return merge(DEFAULT_MOVIES.map(movie => this.http.get<{}>(this.buildRequestUrl(movieTitle))
      .pipe(retry(3), 
        catchError(this.handleError)
      )))
  }
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)
      ))) 
  })
}
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
}