结果为假时重试订阅

时间:2019-03-29 07:15:08

标签: javascript angular typescript rxjs

我想继续重试对服务器的调用(以查看它是否返回true)。

在我的服务中,我创建了一个http调用,如果它能够检索到一个值,则返回true;如果无法检索到一个值(从而得到一个错误),则返回false。

$(()=>{
    // make divs with an onclick attribute tabbable/clickable
    $('div[onclick]')
        .attr('tabindex', '0')                     // Add tab indexes
        .keypress((evt)=>{
            var key = evt.key;
            evt.preventDefault();                  // Ensure all default keypress
                                                   // actions are not used
            if (key === ' ' || key === 'Enter') {  // Only send click events for Space
                                                   // or Enter keys
                evt.currentTarget.click();         // Run the click event for element
            }
        });
});

在组件中,我想重试此操作,直到返回public retryServerCheck(): Observable<boolean> { return this._httpClient.get<boolean>(this.baseUrl + 'ServerCheck') .pipe( map(() => true), catchError(() => of(false) )); } ,这才是我的问题。

true

我尝试在subsribe前面添加一个管道,但是没有运气

this._serverService.retryServerCheck()
  .subscribe(
    (isOnline) => {
      if (isOnline) {
        this._helperServer.navigateToComponent('Login', undefined, 0);
        console.log('online');
      } else {
        this.lastRetry = 'A little later...';
        console.log('offline');
      }
    }
  );

我可以在服务中进行重试,但是随后我无法在组件中对此做出反应

this._serverService.retryServerCheck()
  .pipe(
    retry(10),
    delay(100)
  ).subscribe(
    (isOnline) => {
      if (isOnline) {
        this._helperServer.navigateToComponent('Login', undefined, 0);
        console.log('online');
      } else {
        this.lastRetry = 'A little later...';
        console.log('offline');
      }
    }
  );

1 个答案:

答案 0 :(得分:1)

catchErrorretryWhen都将抑制流中的错误。因此,组件中的错误已得到处理。

尝试使retryWhen负责处理重试次数

// service
public retryServerCheck() {
  return this._httpClient.get(this.baseUrl + 'ServerCheck').pipe(
    retryWhen(error$ => error$.pipe(
      take(10),   // <-- number of retries
      delay(500),
      concat(
        /* either throw your own error */
        throwError('no more retries left')
        /* or to pass original error -- use `NEVER` */
        // NEVER
      )
    ))
  )
}

// component
this._serverService.retryServerCheck()
  .subscribe({
    next: (result) => {
      // succeeded
    },
    error: (error)=> {
      // failed
    }
  });

Run this example

expand添加到组件中-当流中有false时重试。

详细了解rxjs error handling and specifics of retryWhen