我正在尝试使用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');
}
答案 0 :(得分:0)
我可以想到两种解决方案:
只需使用concat函数即可将第一个调用中的数据与其他Observable结合起来,从而检索其余页面。
return concat(
of(data),
from(pages).pipe(
mergeMap( page => this.getScrobblesFromAPI(userName, oneWeekAgoUnix, page)),
)
);