【问题标题】:Manipulate Observable<Hero[]>操作 Observable<Hero[]>
【发布时间】:2018-09-06 07:10:46
【问题描述】:

我们以下面的英雄代码获取英雄为例:

/** GET heroes from the server */
  getHeroes (): Observable<Hero[]> {
    return this.http.get<Hero[]>(this.heroesUrl)
      .pipe(
        tap(heroes => this.log(`fetched heroes`)),
        catchError(this.handleError('getHeroes', []))
      );
  }

我想操作 hero[] 的每个元素。我试过 .map 功能:

  getHeroes (): Observable<Hero[]> {
            return this.http.get<Hero[]>(this.heroesUrl)
              .pipe(
                tap(heroes => this.log(`fetched heroes`)),
                catchError(this.handleError('getHeroes', []))
              ).map((result) => {
                 console.log(result); // I am getting all the array and not iteration.
                 return  Object.assign(new Hero(), result);
             );
          }

但是我得到了所有的数组或 Hero[] 并且它没有一个一个地迭代英雄。

【问题讨论】:

  • 把“地图”放在“点击”之前,见stackoverflow.com/questions/47275385/…
  • 您需要在发出的数组上调用 Array.map(),而不是在 observable 上。顺便说一句,你真的不应该混合使用管道运算符和旧的实例运算符。坚持使用可管道化的运营商。
  • map(result=>{return result.map(x=>Object.assign(new Hero(),x)})

标签: angular


【解决方案1】:

Map 操作的是您目前获得的Observable 数据,而不是其中的每个数据。而且因为您将英雄放在数组中,而不是一个一个地,所以您将整个数组放在map 中作为单个数据。

您需要在结果上使用Array.map,创建您的映射数组并将其传递给下一个。

RxJS 5 现在使用 do 而不是 tap。

【讨论】:

  • 有没有一个选项可以一个一个地获取英雄而不是一个数组?你能分享一个如何使用 Array.map 的小例子吗?
  • 你不需要一一获取。为了从服务器获取数组,您可以通过map 函数(如return result.map(item =&gt; Object.assign(new Hero(), item)) )对其进行操作,或者将数组转换为result as Hero[]
  • array or Hero?
  • Suren Srapyan - 我尝试了 rxJS 映射函数 - result.map(item => Object.assign(new Hero(), item)) 并且它不起作用,因为该项目是一个数组 英雄而不是单个英雄。如何将数组转换为 Hero[]?
猜你喜欢
  • 2018-10-17
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多