重试后,Angular HTTP.Get失败后,投掷错误



我正在尝试实现重试的angular5 http。我写了

http.get<any>('/api/study').retryWhen(
    (errors: Observable<any>):Observable<any> => {
        return errors.flatMap((error: any) => {
            if (error.status  == 500) {
                return Observable.of(error.status).delay(1000);
            }
            return Observable.throw(error);
        }).take(5);
    });

如果出现错误500,这将继续重试5次。但是,如果连续发生5个失败,则返回成功(带有空数据(。我不要那个。相反,我希望它丢弃最后一个错误。

我尝试将.concat(Observable.throw({}))放置在take((之后,但它没有给我任何信息,例如最新错误的状态代码。

上次重试失败后,如何获得最新错误?

您不需要使用take(5)来计算失败的尝试,并使用局部变量自己计数。

例如,您可以这样做:

http.get<any>('/api/study').retryWhen((errors: Observable<any>) => {
    let errors = 0;
    return errors.flatMap((error: any) => {
        if (errors++ < 5 && error.status  == 500) {
            return Observable.of(error.status).delay(1000);
        }
        return Observable.throw(error);
    });
});

.retryWhen只能完整或错误 - 在这两种情况下,进一步的检索将被中止。参见文档。

因此,当您添加.take(5)时,您基本上是在告诉它重试5次,然后完成,此时它只能完成(因此也不能返回错误 - 其他,不是两者(。

因此,使用.take()无法解决您的问题。

不幸的是,这意味着您必须跟踪重试时的重试计数 - 因此,对于5个计数,您只需让它返回错误(这将触发重试(,最后在第6次上手动丢弃错误。然后,您可以在捕获块中捕获最终错误。

类似的东西(代码未测试,但显示了这个想法(:

http.get<any>('/api/study').retryWhen(err => {
    console.log('retrying');
    let retries = 0;
    return err
      .delay(1000)
      .map(error => {
        if (retries++ === 6) {
          console.log('retry number ', retries);
          throw error; <- THIS WILL CAUSE retryWhen to complete
        }
        return error; 
      });
  })
  .catch(err => {
    console.log('caught');
    return Observable.of(err);
  })
  .subscribe(data => {
    console.log('subscriber');
    console.log(data);
  });

作为附带说明,添加.concat(observable.throw({}((无法解决您的问题,因为当开火时,您的5次恢复完成了,因此重新恢复时(即返回,返回,返回,所以没有错误(。这就是为什么Concat无法丢弃最后一个错误,因为它从未收到过。

最新更新