Angular 2 Http 重试时间

2023-12-23

我正在尝试使用retryWhen在 HTTP 调用中。

当尝试像这样使用时它工作得很好:

return this.http.get(`${environment.apiUrl}/track/${this.user.instance._id}/${this.currentPlayer.playlist.id}/next?s=${this.playerCounter}`, options)
      .timeout(500, new TimeoutError(`Timeout trying to get next track. [instanceId=${this.user.instance._id}]`))
      .retryWhen(attempts => {
        return Observable.range(1, 3).zip(attempts, i => i).flatMap(i => 3 === i ? Observable.throw(attempts) : Observable.timer(i * 1000));
      })

如果出现超时错误,则最多尝试 3 次。

但是,总是有一个问题,我想让它更加抽象以用于各种用例,为此,我必须检查错误的类型。

仅重试 TechnicalErrors。

所以我尝试了这个但没有成功。

.retryWhen(attempts => {
    return attempts.flatMap(error => {
      if(error instanceof TechnicalError) {
        return Observable.range(1, 3).zip(attempts, i => i).flatMap(i => 3 === i ? Observable.throw(attempts) : Observable.timer(i * 1000));
      } else {
        Observable.throw(error);
      }
    });
  })

它在第一次尝试时停止并且不执行Observable.timer(),既不Observable.throw().

我几乎可以肯定问题出在第一个问题flatMap,我已经尝试使用mergeMap, 没有成功。

提前致谢!


在 RxJS 5 中flatMap()只是别名mergeMap() :).

问题在于您使用回调的方式retryWhen()操作员。它只被调用一次,然后每次错误信号到达时,它都会被推送到从此回调返回的 Observable 中。

在你的第二个例子中,你从返回 Observableattempts.flatMap然后再次订阅该回调.zip(attempts, i => i)。但是这个zip运算符永远不会被调用,因为它是在该值已经被消耗后调用的attempts.flatMap。这也是为什么Observable.range(1, 3)总是从头开始。

我知道这看起来很混乱。请注意:

  • 的回调retryWhen()仅被调用一次。
  • 的回调attempts.flatMap()每次出现错误时都会调用。

所以你只需要重构你的代码,例如如下所示:

var source = Observable.create(obs => {
        obs.next(1);
        obs.next(2);
        obs.error(new TechnicalError('error from source'));
    })
    .retryWhen(attempts => {
        console.log('retryWhen callback');
        let count = 0;

        return attempts.flatMap(error => {
            if (error instanceof TechnicalError) {
                console.log(error);
                return ++count >= 3 ? Observable.throw(error) : Observable.timer(count * 1000);
            } else {
                return Observable.throw(error);
            }
        });
    })
    .subscribe(
        val => console.log(val),
        err => console.log('subscribe error', err),
        _ => console.log('complete')
    );

这会打印到控制台:

1
2
retryWhen callback
TechnicalError { msg: 'error from source' }
1
2
TechnicalError { msg: 'error from source' }
1
2
TechnicalError { msg: 'error from source' }
subscribe error TechnicalError { msg: 'error from source' }

观看现场演示:https://jsbin.com/hobeda/3/edit?js,控制台 https://jsbin.com/hobeda/3/edit?js,console

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

Angular 2 Http 重试时间 的相关文章

  • Angular 2 链式 Promise 并传递拒绝

    应该是一个简单的问题 但是我找不到有关如何做到这一点的文档 像这样链接一个承诺 Making a promise no problem let promise new Promise resolve reject gt let data d
  • 在“FormGroup”中预填充输入字段 - Angular2

    我正在使用 Angular2 反应形式 一切正常 直到我想在表单中的字段之一中显示预填充的值 设想 页面上有多个按钮 每个按钮都会打开一个表单 其中的字段如下 Name Email Message 产品代码 gt 此值应根据服务中的每个项目
  • Plesk Windows 部署 Node.js

    我创建了一个以 Node js 作为后端的 Angular 项目 这是服务器文件结构 Home directory httpdocs node hm dist browser folder server folder server js p
  • 查询参数更改时,路线不会更新

    在我的应用程序中 有多个链接 其中我有一些links与相同的route但与不同的query parameters 比如说 我有这样的链接 deposits withdrawals deposits withdrawals id 1 depo
  • 如何使 Angular2 Service 单例?

    我正在尝试在我的应用程序中实现身份验证防护 IE 只有经过身份验证的用户才能访问我的应用程序的某些路由 我正在遵循给出的意见here https angular io docs ts latest guide router html 用户登
  • Angular 4 与 Webpack 2,动态加载脚本

    我刚刚在一个项目中尝试使用 Angular 4 和 Webpack 2 我试图在 ngOnInit 期间加载一些脚本 但遇到了一些问题 问题1 我的 ngOnInit 中有以下代码 System import node modules jq
  • ngmodel与Angular2中复选框的动态数组绑定

    我有一个 Angular 2 组件 其中我从数组生成复选框列表 现在我需要根据选中的复选框填充不同的数组 这应该是双向绑定 这意味着如果复选框的值已在数组中 则必须已经检查了复选框 我在 Angular 1 中使用了一个名为 checkli
  • 从 Angular 4 中的选择选项获取价值

    如何从 Angular 4 中的 select 选项获取值 我想将它分配给 component ts 文件中的一个新变量 我已经尝试过但没有输出任何内容 你也可以使用 ngModel 来做到这一点吗 组件 html
  • 在 Angular 材质表上调用 renderRows()

    我试图在更新表中使用的数据后刷新我的 Angular 表 文档说 您可以通过调用其 renderRows 方法来触发对表的渲染行的更新 但它不像普通的子组件 我可以使用 ViewChild MatSort sort MatSort 因为我不
  • Angular - Angular Material 2 步进器控件

    我使用 Angular Material 2 步进器设置了一个线性步进器 我有不同组件 组件a 组件b 组件c 中的表单 在我的主容器组件 容器组件 中 我希望有一个线性步进器 当它们的形式有效时 它可以 步进 通过每个组件 是否有某种功能
  • npm 错误!遵循 Angular 2 快速入门时出现无效名称:“@angular/core”

    我正在尝试遵循Angular 2 快速入门 https angular io docs ts latest quickstart html 第一步是设置环境 我对 npm 并不是完全陌生 我设法安装并尝试了 Ember 但仅此而已 下面是我
  • 如何在 Ionic 2 中动态创建具有特定类的模式?

    嗨 我已经被一个问题困扰好几天了 到目前为止还没有研究证明足够 我正在尝试在 Ionic 2 中创建一个具有特定类 或 id 的简单模式 我需要这样简单的东西
  • msal.js 访问令牌中的自定义声明

    我使用 msal js 保护了我的 Angular 7 应用程序 我创建了一个自定义策略 该策略返回 id token 和 access token 中的自定义声明类型 为了实现这一目标 我一直在遵循本教程 https learn micr
  • 如何禁用 Angular 2 中的复选框

    我想禁用复选框输入 我的意思是 用户无法选中复选框 有一个属性可以禁用它吗 例如 启用 或 禁用 或者我该如何解决这个问题
  • 为什么我们需要`ngDoCheck`

    我似乎不明白为什么我需要ngDoCheck生命周期钩子除了用于简单的通知之外 特别是在其中编写代码如何对更改检测产生影响 我发现的大多数例子都显示了无用的例子 比如this one https juristr com blog 2016 0
  • 禁用 Angular 2 中的按钮

    我想如果输入 合同类型 为空 则 保存 按钮不可点击 保存按钮 div class col md 4 div
  • 如何在 Angular2 中注销时获取新实例/重新加载所有服务

    我正在开发 Angular 2 应用程序 它类似于最后提供的 Plunker 链接 在 HeroService 中 我有一个属性 clickCount 该属性将在单击英雄时增加 但是登录后我想重置这个参数 我不想使用该服务并重置其值 实际上
  • JS文件中的System.register是什么意思?

    在 Angular 2 中使用指令时 JS 文件中的 System register 是什么意思 我认为这个问题并不特定于 Angular2 中的指令 它是关于 ES6 TypeScript 和其他使用 SystemJS 的现代编译器的一般
  • Mat-自动完成表单控件名称

    我在 Mat Autocomplete 上使用 formControlName 时遇到问题 我不知道为什么 但我的 formControlName 不会发送数据 我是否写错了 当我尝试从 HTML 中删除 formControl 时 它总是
  • 此版本的 CLI 仅与 Angular 版本 5.0.0 或更高版本兼容错误

    我已经有 Angular 项目在 4 版本中运行 在安装新项目时 不幸的是我安装了 6 版本的 Angular cli 在以 4 版本运行的旧项目中运行 ngserve 命令时 这会引发错误 您的全局 Angular CLI 版本大于本地版

随机推荐

  • Python OS X - 从文件中获取“添加日期”信息

    你好 这是我的第一篇文章 我开始做一些编码Python今天在 OS X 上 我注意到 OS X 有这样的东西date added这是文件放入指定文件夹的时间 我正在尝试将该日期作为timestamp 但是没有一种类型有效 我已经尝试了我所知
  • iPhone 上的 HTML5 视频元素有边框

    我最近一直在构建一个应用程序 并在开始时播放加载动画 只是一个 mp4 视频 出于美观目的 除了 iPhone 之外 它在任何地方都可以正常工作 问题在于 视频的某些部分周围有一条灰线 每边并不相同 如果我尝试对页面进行屏幕截图 则线条将不
  • Pandas.groupby.apply() 中的内存泄漏?

    我目前正在使用 Pandas 进行一个 csv 源文件大约 600mb 的项目 在分析过程中 我将 csv 读入数据帧 对某些列进行分组并对分组的数据帧应用一个简单的函数 我注意到在此过程中我进入了交换内存 因此进行了基本测试 我首先在 s
  • Android 应用程序可以在模拟器中运行,但不能在设备中运行

    我使用 android 1 6 api 4 创建了一个 android 应用程序 android minSdkVersion 是 3 我使用的模拟器运行这个应用程序是2 2 它在模拟器中工作正常 然后我将其安装到 htc Hero andr
  • 为什么 Blazor 应用程序中的 XML 验证在本地主机上和作为 Azure 静态 Web 应用程序给出不同的消息?

    edit我做了一个简化的回购协议https github com GilShalit XMLValidation https github com GilShalit XMLValidation 我正在 Blazor WebAssembly
  • 如何将 hset 与 django-redis-cache 一起使用?

    我是 django redis 的新手 我开始熟悉 heroku redis 插件 但是 我只能使用set and get 当我尝试使用其他方法时 例如hset 我收到此错误 RedisCache object has no attribu
  • Android Studio 很慢

    我有一个项目 里面有大约 20 个模块 Gradle clean 大约需要 5 分钟 同样 如果我添加一个新模块 gradle 更新项目需要超过 5 分钟 不依赖于外部库 依赖关系仅存在于项目内部的几个模块之间 我有相同的项目 没有 gra
  • 如何获取工作流活动 (SharePoint) 中的上下文项

    我正在为 sharepoint 工作流编写自定义活动 但我不知道如何使用当前工作流项目 SPWeb 或 SPSite I see http blogs microsoft co il blogs davidbi archive 2008 0
  • htaccess如何将子目录重定向到外部URL

    I tried 301 Redirect Old File Redirect 301 www mydomain com subdirectory http newurl com 但这让我进入了 newurl com subdirectory
  • Android 2.3 中出现“无对等证书”错误,但 4 中则没有

    得到 javax net ssl SSLPeerUnverifiedException No peer certificate error 在运行 Android 2 3 的模拟器中 但在 4 中则不然 在 4 中 它运行得很好 我正在尝试
  • varchar 的 DbString、IsFixedLength 和 IsAnsi

    我是 Dapper 的新手 想知道为什么当我的代码在没有它的情况下运行时会出现以下建议 Ansi 字符串和 varchar https github com StackExchange Dapper ansi strings and var
  • MBCS 编码未知

    我正在尝试在 Python 中打开带有 MBCS 编码的文件 但出现错误 如果我写 fileIN open filename r encoding mbcs I get Traceback most recent call last Fil
  • 安装.NET Core Runtime和SDK后需要重启吗?

    我们即将在生产环境中部署 netcore 2 0 应用程序 但我们需要首先安装 NET Core 运行时和 SDK 安装是否需要重启才能生效 既然是生产 我们不希望这种情况发生 我们安装了以下内容here https www microso
  • RAII 和系统资源清理

    RAII 是资源清理的一个很好的解决方案 然而 RAII 基于堆栈展开 如果进程异常终止 堆栈将不会被展开 这意味着 RAII 在这种情况下不起作用 对于进程生命周期的资源来说 这没什么好担心的 但是对于文件系统生命周期或者内核生命周期的资
  • 原则上,Android 设备是否可以通过蓝牙/GameKit 与 iPhone 连接?

    我对纯理论不感兴趣 但作为近期或中期的实际可能性 比如 12 24 个月内 作为一名熟悉 但不专门研究 两个主要智能手机平台的开发人员 我是否应该期望 Android 库的出现 它可以将自己欺骗到 iPhone 应用程序基于 GameKit
  • Spring mockMvc 在我的测试中不考虑验证

    我正在尝试使用mockMvc 设置集成测试 但遇到了问题 事实上 spring没有集成任何验证注解 为了更精确 我放置了可以测试的 Controller 类的代码 Controller public class UserRegisterCo
  • 带有外部更新的 NHibernate 二级缓存

    我有一个 99 只读的 Web 应用程序 有一个单独的服务以特定的时间间隔 例如每 10 分钟 更新数据库 该服务如何告诉应用程序使其二级缓存失效 它真的重要吗 我实际上并不关心我是否有太多过时的数据 如果我不使缓存失效 记录需要多长时间才
  • FBSDK 的 LLDB 问题,每当我放置断点时,我都会收到错误,并且无法打印任何变量

    每当我设置断点并尝试访问任何变量时 我都会收到此错误 如果我尝试在控制台中打印变量 则会收到以下错误 lldb p someVar error Error in auto import failed to get module Jogabo
  • 维护多个设置文件

    目前 我有一个包含各种单选按钮 目录浏览器 日期选择器等的表单 应用程序使用这些设置 并执行文件删除任务 我想知道将这些设置保存到可以稍后加载的外部文件的最佳策略是什么 因此基本上每个配置都可以被加载 执行 然后加载另一个配置 此外 配置可
  • Angular 2 Http 重试时间

    我正在尝试使用retryWhen在 HTTP 调用中 当尝试像这样使用时它工作得很好 return this http get environment apiUrl track this user instance id this curr