代码之家  ›  专栏  ›  技术社区  ›  Armeen Moon

在RXJS中找到适当的运算符,以映射/减少可观察到的内部条目

  •  1
  • Armeen Moon  · 技术社区  · 6 年前
    问题: 查看my 3 console.log 和输出图像。下一步, tap operator is not logging each entry because the output from the previous operation: mergemap(getdatabyurl) output looks like observable<entry[]> 。我认为如果每个条目都是可观察的,比如: observable<observable<entry>[]> 我已经添加了一个 tap operator,在这里我正在进行预期的转换;但是,它不是真正通过订阅工作的,我想知道是否有更好的操作符。

    问题: 是否有适当的运算符映射/减少此mergemap返回的内部条目?或者我如何才能使我的 subscribe log out the proper output?

    this.router$=this.router.events.pipe(
    查找(下一个),
    拔(“URL”),
    合并映射(getdatabyurl)
    TAP(i=& gt;{)
    console.log(i);//输出错误(app.component.ts:52)
    常量输出=i.map(i=>i[“data”])
    .reduce((acc,val)=>。{
    acc[val.id]=val;
    返回ACC;
    },{};
    console.log(output);//正确输出(app.component.ts:58)
    返回输出;
    }),请
    ;
    this.router$.subscribe(console.log);//输出错误(subscriber.js:196)
    < /代码> 
    
    

    输出:

    =mergeMap(getDataByUrl)输出看起来像Observable<entry[]>. 我认为如果每个条目都是可以观察到的,比如:Observable<Observable<entry>[]>. 我添加了一个水龙头运营商,我在那里进行预期的转换;但是,它并不是真正通过订阅工作的,我想知道是否有更好的运营商。

    问题: 是否有适当的运算符映射/减少此mergemap返回的内部条目?或者我该怎么做subscribe记录正确的输出?

    this.router$ = this.router.events.pipe(
      find(nextRoute),
      pluck('url'),
      mergeMap(getDataByUrl),
      tap(i => {
        console.log(i); // Wrong output (app.component.ts:52)
        const output = i.map(i => i[ 'data' ])
                        .reduce((acc, val) => {
                          acc[ val.id ] = val;
                          return acc;
                        }, {});
        console.log(output); // Proper output (app.component.ts:58)
        return output;
      }),
    );
    this.router$.subscribe(console.log); // Wrong output (Subscriber.js:196)
    

    输出:

    1 回复  |  直到 6 年前
        1
  •  1
  •   Fan Cheung    6 年前

    有一个 reduce RX提供的接线员,您可以很高兴地更换 tap 操作与 from 减少 它应该是有效的。无论你从哪回来 水龙头 不通过链,它是一个副作用操作符,主要用于调试或修改全局值。

    this.router$ = this.router.events.pipe(
      find(nextRoute),
      pluck('url'),
      mergeMap(getDataByUrl),
      switchMap(i => from(i).pipe(map(i=>i.data))),
      reduce((acc, val) => {
                          acc[ val.id ] = val;
                          return acc;
                        }, {})
    );