【问题标题】:Array of observables into Observable of Array可观察的数组变成可观察的数组
【发布时间】:2018-03-29 01:20:46
【问题描述】:

我有这段代码需要将Observables 的数组更改为Observable 的数组:

 this.output = this.firsProvider.getIds(uid)  // return array of Ids : String[]
     .flatMap(obs$ => obs$)  
     .map((id: string) => this.secondProvider.getOneItem(id) // return an Observable of Item
     );

目标

我想将项目的所有 Observable 合并为所有项目的一个大的 observable。我的代码只返回输出:Observable < Observable < Item>>

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    我认为您应该考虑使用这样的语法。您可以并行获取请求项目并等待直到所有完成使用 forkJoin 在单个可观察的数组上。此代码将以String[] 开头并生成Observable<Item[]>

    const itemObservables = this.firstProvider.getIds(uid)
        .map(id => this.secondProvider.getOneItem(id));
    
    this.output = Observable.forkJoin(itemObservables);
    

    【讨论】:

      【解决方案2】:

      使用combineLatest 运算符。看看这个函数输入combineLatest

      function t$ArrayToTArray$<T>(ts$:Observable<T>[]):Observable<T[]>{
        return Observable.combineLatest(ts$);
      }
      

      它的第一个数组只有在每个 observables 至少发射一次时才会发射。

      【讨论】:

        【解决方案3】:

        这将返回一个包含项目数组的可观察对象:

         const itemsArray$ = this.firstProvider.getIds(uid)
           // return array of observable item
          .map(idArray => this.secondProvider.getOneItem(id)),
          .mergeMap(observableItemArray => {
              // zip will return an array of items
              return Observable.zip(observableItemArray)
          });
        

        然后,如果您想要一个项目流,请使用 from observable,如下所示:

        const items$ = itemsArray$.mergeMap(itemArray => {
            return Observable.from(itemArray);
        }); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-09
          • 2012-04-20
          • 1970-01-01
          • 2015-08-11
          • 2019-06-04
          • 2017-11-25
          • 2015-10-05
          • 2019-02-25
          相关资源
          最近更新 更多