如何返回父级可观察值?

时间:2019-05-19 19:04:31

标签: angular rxjs

我正在尝试使用mergeMap嵌套一些http请求。 我正在使用的API以部分(页面)的形式返回数据,因此我需要根据总页面数发出更多请求。

因为我需要发出请求才能知道多少页。我总是在第一页上做第一个。结果,我可以知道有多少页,然后开始发出其他请求(从第2页开始)。

一旦我订阅了返回的observable,我就会获得mergeMap内所有请求的数据,除了第一个请求(页面= 1的结果)的结果。

有没有办法返回第一个请求数据?

我试图以page = 1启动内部请求,但是我不喜欢这种方式,因为我已经有了该请求的数据。

这是函数的返回值:

 return this.getScrobblesFromAPI( userName, oneWeekAgoUnix, 1 )
    .pipe(
      mergeMap( data => {
        const totalPages: number = parseInt(data['recenttracks']['@attr'].totalPages, 10);
        const pages: number[] = [];
        //Starting from page 2
        for (let i = 2; i <= totalPages; i++) {
          pages.push(i);
        }
        return from(pages).pipe(
          mergeMap( page => this.getScrobblesFromAPI(userName, oneWeekAgoUnix, page)),
        );
      }),
      map( data => data['recenttracks']['track'].slice(1) )
  );

此函数返回http.get()(HttpClient)的可观察对象

private getScrobblesFromAPI( userName: string, from: number, page: number ){
   // http : HttpClient
   return this.http.get('url & params');
} 

1 个答案:

答案 0 :(得分:0)

我可以想到两种解决方案:

  1. 创建一个空数组并将所有数据推入其中。在外部管道的末尾返回该数组,这样它将进入订阅回调。
  2. 只需使用concat函数即可将第一个调用中的数据与其他Observable结合起来,从而检索其余页面。

    return concat(
        of(data), 
        from(pages).pipe(
          mergeMap( page => this.getScrobblesFromAPI(userName, oneWeekAgoUnix, page)),
        )
    );