我可以在 Rxjs 重试时更改查询参数值吗?



我有这个服务,最初返回空值(初始化后台作业([ this.q = true].但是以后如果我更改它更改为[ this.q = false]并且如果作业成功,它将返回值。

所以,首先我需要打电话给[ this.q = true]并重试[ this.q = false]。 但是下面的代码不起作用。它总是使 https://api.example.com?q=true

return this.http.get('https://api.example.com?q=' + this.q)
.map((res: any) => {    
if (res === null) {          
throw new Error("not enough tiles !");
}                
return res;
}).catch((e) => {    
this.q = false;
return error;
})
.retryWhen(e => e.delay(2000))
.retry(3);

>Retry重新订阅源可观察,因此,如果要更改retryget请求的参数,则应使参数值的计算成为源可观察的一部分。 例如

return Observable.of('https://api.example.com?q=')
.concatMap((baseUrl) => this.http.get(baseUrl + this.q))
.map((res: any) => {    
if (res === null) {          
throw new Error("not enough tiles !");
}                
return res;
}).catch((e) => {    
this.q = false;
return error;
})
.retryWhen(e => e.delay(2000))
.retry(3);

点赞 @zafeiris.m,感谢我这个解决方案的灵感。

不完全是当前帖子的答案: 我需要调用一个返回可观察的票证列表的服务,当收到 http 应答时,再次调用页面偏移量增加的服务,重复直到不存在下一页链接。

searchTickets() {
const onSearchResult = (listTicketsResponse: ListTicketsResponse) => {
this.searchOffset += this.searchPageSize;
this.allSearchedTickets.push(...listTicketsResponse.result.elements);
}
of (1) // Create an observable 
.pipe( // pipe it just to concatened it with http service call 
concatMap(() => { // concatened it with the http search tickets service, to ensure params are updated when repeatWhen be call
return this.ticketsService.searchTickets(searchTicketsRequest, this.searchOffset, this.searchPageSize); // return observable of request to API 
}), // repeat when previous observable complete 
repeatWhen((obs: Observable < ListTicketsResponse > ) => {
return obs.pipe(
delay(100)); // wait a little  
}),
retryWhen((obs: Observable < ListTicketsResponse > ) => {
console.error("ERROR WITH searchTickets WAIT 10 secondes ")
return obs.pipe(
delay(10000)
);
}), // take while API response tell us next link exist
takeWhile((listTicketsResponse: ListTicketsResponse) => {
onSearchResult(listTicketsResponse); // add to list, update offset
return (listTicketsResponse.result.links.next ? .href ? .length ? ? 0) > 0; // true if next url is not empty
}),
).subscribe();
}

最新更新