Angular - 在所有 HTTP 重试失败后捕获错误

2023-12-11

我正在使用 Angular 服务从我的API。我实现了重试功能,以防获取数据失败。现在,当所有重试都耗尽时,我需要处理错误,但我无法捕获它。

以下是我的代码,

public getInfoAPI(category:string, id:string = "", page:string = "1", limit:string = "10"){
    var callURL : string = '';

    if(!!id.trim() && !isNaN(+id)) callURL = this.apiUrl+'/info/'+category+'/'+id;
    else callURL = this.apiUrl+'/info/'+category;

    return this.http.get(callURL,{
      params: new HttpParams()
        .set('page', page)
        .set('limit', limit)
    }).pipe(
      retryWhen(errors => errors.pipe(delay(1000), take(10), catchError(this.handleError)))//This will retry 10 times at 1000ms interval if data is not found
    );
  }
// Handle API errors
  handleError(error: HttpErrorResponse) {
    console.log("Who's there?");
    if (error.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      console.error('An error occurred:', error.error.message);
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
    }
    // return an observable with a user-facing error message
    return throwError(
      'Something bad happened; please try again later.');
  };

我能够以 1 秒延迟成功重试 10 次,但是当 10 次重试完成后,我希望无法捕获错误。

enter image description here

Note:

我是 Angular 的新手,因此如果您能在此通话中提出改进建议,我们欢迎您这样做。


    return this.http.get(callURL,{
      params: new HttpParams()
        .set('page', page)
        .set('limit', limit)
    }).pipe(
      retryWhen(genericRetryStrategy({maxRetryAttempts: 10, scalingDuration: 1})),
      catchError(this.handleError)
    );

Where genericRetryStrategy是从这个当资源重试

export const genericRetryStrategy = ({
  maxRetryAttempts = 3,
  scalingDuration = 1000,
  excludedStatusCodes = []
}: {
  maxRetryAttempts?: number,
  scalingDuration?: number,
  excludedStatusCodes?: number[]
} = {}) => (attempts: Observable<any>) => {
  return attempts.pipe(
    mergeMap((error, i) => {
      const retryAttempt = i + 1;
      // if maximum number of retries have been met
      // or response is a status code we don't wish to retry, throw error
      if (
        retryAttempt > maxRetryAttempts ||
        excludedStatusCodes.find(e => e === error.status)
      ) {
        return throwError(error);
      }
      console.log(
        `Attempt ${retryAttempt}: retrying in ${retryAttempt *
          scalingDuration}ms`
      );
      // retry after 1s, 2s, etc...
      return timer(retryAttempt * scalingDuration);
    }),
    finalize(() => console.log('We are done!'))
  );
};

斯塔克闪电战

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular - 在所有 HTTP 重试失败后捕获错误 的相关文章

随机推荐

  • 将 typeahead.js 输出到多个文本框中

    我正在为我的公司开发一个内部 Web 表单 我试图使用 typehead js 从本地数组加载名称 我能够毫无问题地执行此操作 但是任务的第二部分是当在第一个文本框中选择员工姓名时 将该员工的 ID 放入第二个文本框中 我无法成功地将值输出
  • jQuery 存储和检索表单状态(带数据)

    有什么方法可以将表单状态存储在例如 cookie 中并检索它吗 我检查了序列化API但我不知道如何检索表单上的序列化数据 是否可以 Update 我把我的代码here 检查 End of cookie 插件后的 javascript 代码
  • 解决“找不到资源”的问题。错误

    我有一个 MVC 3 应用程序 其中内置了几个区域 其中一个区域是我网站的管理部分 一切都工作得很好 我想尝试 MvcContrib Portable Areas 以使我的应用程序更加模块化 因此我安装了 MvcContrib 经过一番尝试
  • 实体框架 4 / POCO - 从哪里开始? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我已经编程了一段时间 并且之前使用过 LINQ To SQL 和 LINQ To Entities 尽管在使用实体时它一直处于实体 表 1 1 关系上 即与 L2SQL 没有太大区别
  • Pebble 手表开发教程中的这个点语法是什么意思? [复制]

    这个问题在这里已经有答案了 我在 Pebble 手表应用程序开发教程中遇到了以下代码 Set handlers to manage the elements inside the Window window set window handl
  • 我可以检测窗口是否部分隐藏吗?

    是否可以检测我的外部程序的窗口是否 1 完全可见 2 部分隐藏或 3 完全隐藏 如果窗口 基于检索到的句柄 不可见 我希望能够告诉我的应用程序不要执行任何操作 我不关心窗口是否有焦点 z 顺序是什么 或者其他什么 我只关心窗口显示了多少 如
  • 使用 Amazon API MWS 进行签名查询

    我正在尝试向卖家亚马逊网络服务 MWS 提出签名请求 我正在使用这里的脚本 将亚马逊 MWS 暂存器查询转换为 API 调用 但我不知道为什么会出现错误 我们计算的请求签名与您提供的签名不匹配 请检查您的 AWS 秘密访问密钥和签名方法 有
  • 在运行时实现接口

    是否可以使已编译的类在运行时实现某个接口 例如 public interface ISomeInterface void SomeMethod public class MyClass this is the class which i w
  • pySerial write() 在 Python 解释器中工作正常,但在 Python 脚本中不行

    最近 我正在尝试在Arduino上进行某种 灯光控制 我使用 Raspberry Pi 通过串口 USB 电缆 发送控制消息 这是 Arduino 代码 int redled 12 int whiteled 48 void setup Se
  • R - 如果日期在范围内,则求和

    我已经设法在 excel 中轻松完成此操作 但想在 R 中完成此操作 我有两个数据框 MediaPlanDF 215 个 obs 29 个 var 我只关心其中的 4 个变量 开始日期 航班日期 结束日期 航班日期 每日消费 每日展示次数
  • 如何修复 Findbugs HTTP 参数直接写入 HTTP 标头输出

    我有一个类 RequestFilter 和 Override 方法 doFilterInternal 当我添加响应标头时 findbugs 显示直接写入 HTTP 标头输出的错误 HTTP 参数 那么我该如何解决这个问题呢 谢谢大家 Str
  • sql 如何将两个表的三个查询合并为一个查询

    我有以下两个表 Table1 id name A3 B2 A3 B400 A5 B100 A7 B200 A8 B6 A8 B2 A8 B3 and Table2 id name company A1 company1 A2 company
  • Jquery基于滚动翻译元素

    我正在尝试重现发现的效果这一页 所以我们的想法是 当用户滚动时 选项卡就会显示出来 我对此的看法是使用 jquery 沿着滚动条翻译它们 我的问题是 我给了他们特定的滚动区域 在此期间它们将被翻译 但如果滚动 跳 出该区域 它们将保持在原来
  • 如何在 iOS 7 的 UIAlertView 中添加子视图?

    我在 iTunes 商店中有一个应用程序 它显示一些UILabel and UIWebView on UIAlertView 根据会议视频显示 addSubView for UIAlertView不管用 他们谈论过ContentView 但
  • PHP:通过 ClassName::method 语法调用实例方法,会导致静态调用吗?

    她是我的代码 class MyClass public prop public function method echo this gt prop 然后在代码中的某个地方 意外地 MyClass method 我预计上面的行会出现解释错误
  • IsPersistent 不起作用 PasswordSignInAsync Identity asp.net core

    我在我的网站中使用 dotnet core 5 和 Identity 进行授权 我有一个自定义课程User为了我的身份 这是我的配置服务 services AddDbContext
  • 使用 Parse iOS 登录 Facebook 和 Twitter 只能运行一次

    我在 Parse SDK 中使用 twitter 和 Facebook 登录 对于每个应用程序启动 我都可以登录每个服务一次 但是当我使用 PFUser logOut 注销时 我无法再次登录 PFFacebookUtils logInWit
  • C# 使 winform readonly radioButton 看起来像标准的

    简单的问题 如果我在 winform 项目中设置一个单选按钮 它的外观 字体颜色 将更改为浅灰色 当我将其启用属性设置为 false 时也是如此 我怎样才能创建一个看起来像普通按钮的只读单选按钮 因为这样你几乎看不到它 Thanks 作为一
  • 如何使用自定义引导程序执行 Wix 升级

    我想在我们的 WiX 自定义 BA 安装程序的第二版中启用升级 在我的Product wxs中 产品ID设置为 版本设置为2 0 0 升级代码与第一个版本相同 为了检测升级 我在 Boostrapper 中使用了 DetectRelated
  • Angular - 在所有 HTTP 重试失败后捕获错误

    我正在使用 Angular 服务从我的API 我实现了重试功能 以防获取数据失败 现在 当所有重试都耗尽时 我需要处理错误 但我无法捕获它 以下是我的代码 public getInfoAPI category string id strin