2

我有这项服务,最初返回 null(初始化后台作业)[ 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);
4

2 回答 2

5

Retry重新订阅源 Observable,因此,如果要更改get请求的参数 on retry,则应将参数值的计算作为源 observable 的一部分。例如

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);
于 2018-06-28T07:59:20.040 回答
0

支持@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();
}

于 2022-02-05T16:23:35.703 回答