重试 Javascript.Promise.reject 有限次数或直到成功

2024-02-14

我有一个函数说myMainFunction从客户端调用,然后调用mypromisified功能。

设想: mypromisified函数可能会间歇性失败,我需要延迟(以指数增长)调用此函数,直到成功或达到最大尝试次数。

到目前为止我所拥有的

以下代码说明了我的场景并重复自身直到成功,但它会无限期地尝试,直到达到一定的计数

// called once from the client
myMainFuntion();

function rejectDelay(delay, reason) {
   // call main function at a delayed interval until success 
   // but would want to call this only a limited no of times
    setTimeout(() => {
      myMainFuntion(); // calling main function again here but with a delay
    }, delay);
}


function myMainFuntion() {
  var delay = 100;
  var tries = 3;
  tryAsync().catch(rejectDelay.bind(null, delay));
}

function tryAsync() {
  return new Promise(function(resolve, reject) {
    var rand = Math.random();
    console.log(rand);
    if (rand < 0.8) {
      reject(rand);
    } else {
      resolve();
    }
  });

}

while内部循环rejectDelay肯定不会工作,因为即使在执行 setInterval 内的实际函数之前计数器也会增加,所以我不确定如何解决这个问题?所以...

I tried promisifying the setInterval像这样的事情知道它会失败:(因为它不会减少计数器,但也不知道如何正确处理。

function rejectDelay(delay, maximumTries, reason) {
  return new Promise(function (resolve, reject) {
    console.log(tries + ' remaining');
    if (--maximumTries > 0) {
      setTimeout(function() {
        foo();
      }, 500);
    } 
  });
}
function myMainFunction() {
  var delay = 100;
  var maximumTries = 3;
  tryAsync().catch(rejectDelay.bind(null, delay, maximumTries));
}

使用我经常使用的几个辅助函数,这变得非常容易

那些“帮手”

Promise.wait = (time) => new Promise(resolve => setTimeout(resolve, time || 0));
Promise.retry = (cont, fn, delay) => fn().catch(err => cont > 0 ? Promise.wait(delay).then(() => Promise.retry(cont - 1, fn, delay)) : Promise.reject('failed'));

代码:

function myMainFuntion() {
      var delay = 100;
      var tries = 3;
      Promise.retry(tries, tryAsync, delay);
}

ES5 版本的帮助程序

Promise.wait = function (time) {
    return new Promise(function (resolve) {
        return setTimeout(resolve, time || 0);
    });
};
Promise.retry = function (cont, fn, delay) {
    return fn().catch(function (err) {
        return cont > 0 ? Promise.wait(delay).then(function () {
            return Promise.retry(cont - 1, fn, delay);
        }) : Promise.reject('failed');
    });
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重试 Javascript.Promise.reject 有限次数或直到成功 的相关文章

  • 如何在 Electron 应用程序中通过 navigator.geolocation 获取当前位置?

    当我尝试获取当前位置时 navigator geolocation getCurrentPosition handleCoordinates handleError timeout 10000 它返回 网络位置提供商位于 https www
  • 为什么 Eclipse 有时会对 JavaScript 中的数组数组发出警告?

    在 Eclipse 中 以下 JavaScript 行 var a1 1 2 3 4 生成警告 Type mismatch cannot convert from Number to any Type mismatch cannot con
  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • 我无法注入带有“!important”规则的样式[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码注入样式 document body style color green important Per CSS 级联引用 http www w3 org TR CSS2 cascade html
  • moment.calendar() 没有时间

    我想使用不带时间的 moment calendar 选项 所以而不是 上周二下午 5 点 我想要 上周二 有人知道 Moment 现在是否有解决方案吗 我找到了这个小提琴http jsfiddle net nawxZ http jsfidd
  • 如何检测不渲染 .png 透明的浏览器

    我有这段代码可以根据一周中的某一天渲染图像 但在 IE6 及更低版本以及可能其他一些浏览器中 它不会呈现 png 不透明度 所以我想稍微改变一下 这样它就会检测到不渲染 alpha 透明度的浏览器 并告诉他们加载这个图像 img horar
  • 如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?

    我对 Angular 很陌生 所以这可能是一个新手问题 我正在尝试实现一个简单的任务管理器 只是一个练习 以 Rails 作为后端 以 Angular 作为前端 到目前为止 我遵循了教程 一切正常 现在我想在全球范围内实施身份验证 这意味着
  • 解释 javascript 中的奇怪行为

    我在推特上看到了这个 我也无法解释 定义一个onload函数按以下两种方式工作 1 JSFiddle http jsfiddle net 6rq9k 2 JSFiddle http jsfiddle net 6rq9k 1
  • 如何处理 d3 中 Beeswarm 图中的碰撞?

    我一直在玩这个例子here https gf neocities org co2bs co2bee html一会儿 我想做的是突出显示图中的单个节点 圆圈 通过使用边框使其变大 稍后我也想在其中添加文本或字母 目前 我已经圈了Bhutan图
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 如何在 jQuery 中使用 CSS“background-image”属性添加的图像上绑定单击事件

    这是我的小提琴link http jsbin com otisur 1 edit 我想我的问题通过标题本身就很清楚了 尽管如此 我正在寻找一种绑定的方法click使用 css 添加的图像上的事件background image财产 我知道
  • Javascript:如何根据 html 标签扩展用户选择?

    乐代码 http jsfiddle net frf7w 12 http jsfiddle net frf7w 12 所以现在 当前的方法将完全按照 选择的方式获取所选文本 并添加标签 以便在显示时页面不会爆炸 但我想做的是 就是说 当用户选
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • JavaScript 逻辑赋值是如何工作的?

    在 javascript 中 如果我们有一些代码 例如 var a one var b q a alert b 逻辑 OR 运算符会将 a 的值分配给 b 并且警报将为 一 这仅限于作业还是我们可以在任何地方使用它 似乎空字符串被视为与未定
  • JQuery 可排序嵌套可排序 div

    这个问题与这个有关Nest jQuery UI 可排序 https stackoverflow com questions 19129476 nest jquery ui sortables 但我无法解决我的问题 问题是 我有一个包含项目的
  • 从 url 角度加载模板并在 div 内编译

    由于我是 Angular JS 的新手 我想知道如何加载外部模板并将其与一些数据一起编译到目标中div 例如我有这个模板
  • 将 ESLint 与 Airbnb 样式和选项卡结合使用 (React.js)

    我正在开发一个 React js 应用程序 并且正在尝试检查我的代码 我将 ESLint 与 Airbnb 风格一起使用 但出现以下错误 src Test jsx 4 2 error Unexpected tab character no
  • 将数字限制为段的最优雅的方法是什么?

    比方说x a and b是数字 我需要限制x到段的边界 a b 换句话说 我需要一个钳位功能 https math stackexchange com q 1336636 clamp x max a min x b 有人能想出一个更易读的版
  • 在部分渲染时执行 JavaScript

    我有一些 JavaScript 代码 我想在用户单击其文件夹之一后执行 它会触发 show 操作和 show js erb 从而呈 现部分内容 Show js erb 当用户单击其文件夹之一时触发 如下所示 body append 它成功注
  • Skrollr 添加空白

    我已经尝试了一切 我在谷歌上阅读了 4 5 页试图找到适合我的修复程序 已经筋疲力尽了 即使我使用 skrollr 示例 我的问题仍然存在 不是说他们做错了什么 我知道我只是没有正确理解它 因此 我上传了一个演示 仅在移动设备上展示这个尴尬

随机推荐

  • Jquery、Ajax、Post 函数、Rails

    我是 Rails 新手 有一个关于从 ajax 发布到 Rails 控制器并将数据返回到 javascript 的问题 我非常不熟悉它的实际工作原理 但我已经从其他 SOF 线程中拼凑了一个工作后函数 现在 我通过简单的按钮单击来发布数据
  • 当 .net 程序由于未捕获的异常而退出时,操作系统级别会发生什么?

    实际问题 当程序因未捕获的异常而崩溃时 在 Windows 中 会发生什么 是否有一个 dll 函数 我可以挂接该函数来记录有关崩溃的一些基本信息 Context 我计划编写一个程序 该程序将收集有关在我的本地电脑上崩溃的任何应用程序的一些
  • 如何使用 Perl 正则表达式转义字符串中的美元符号 ($)

    我试图使用 perl 正则表达式转义给定字符串中的几个特殊字符 它适用于除美元符号之外的所有字符 我尝试了以下方法 my special characters special characters special characters sp
  • Laravel 自己的变量范围

    我使用半正矢公式来计算距离 这工作正常 但我想隐藏距离大于该结果的 max radius 字段的结果 这是我的数据库架构 这是我正在使用的查询 你可以看到我硬编码了距离 50 public function scopeFitsDistanc
  • 如何处理 AngularJS 中的 $resource 服务错误

    我正在向我的 API 发出请求 并且正在使用 AngularJS resource 模块 它与 http 不同 所以我不知道如何处理我的错误 我的服务 var appServices angular module app services
  • 在自定义列表视图中滚动时复选框未选中

    我知道这个问题已经被问了一遍又一遍 但我仍然无法找到真正对我有帮助的建议 每当列表向下滚动时 该复选框就会被取消选中 是的 我使用布尔数组来存储值 但这仍然不能解决问题 这是我的代码 请为此提出一个解决方案 谢谢 public View g
  • Node.js、MongooseError 中的操作 `users.insertOne()` 缓冲在 10000 毫秒后超时

    我正忙于创建一个项目 允许用户输入 电子邮件 和 密码 来注册该网站 当我尝试使用 电子邮件 和 密码 输入用户来进入此网站时 出现以下错误 MongooseError 操作 users insertOne 缓冲超时 10000毫秒 未处理
  • 如何从现有类型定义类型但使用可选键(不使用 Partial)?

    我正在 React Redux 中进行一些状态合并 const newStateSlice state activeData entities action payload localId action payload isModified
  • 是否有 NSLog(@"%s", __PRETTY_FUNCTION__) 的 Swift 替代方案

    在 Objective C 中 您可以使用以下命令记录正在调用的方法 NSLog s PRETTY FUNCTION 通常这在日志记录宏中使用 虽然 Swift 不支持宏 我认为 但我仍然想使用包含被调用函数名称的通用日志语句 这在斯威夫特
  • 标签内的图像和文本

    这是生成的 html asp net 删除了一些客户端识别详细信息 在 Windows XP IE 7 中 单击图像不会执行任何操作 单击文本执行超链接 右键单击任意位置 然后选择open in new window or open也有效
  • Django:如何使用另一个应用程序中的模型

    我有两个应用程序 homepage and blog 我有一个模型Post在应用程序中blog 我可以将此模型用于应用程序blog但不适用于应用程序homepage 我如何在应用程序中使用这个模型homepage 我想在主页中显示我最近的一
  • 立即检测 iOS 方向变化

    我有一个游戏 其中设备的方向会影响游戏的状态 用户必须在横向 纵向和反向横向方向之间快速切换 到目前为止 我一直在通过以下方式注册游戏以获得方向通知 UIDevice currentDevice beginGeneratingDeviceO
  • jQuery 按值选择选项元素

    我有一个由 span 元素包裹的 select 元素 我不允许使用 select id 但可以使用 span id 我正在尝试编写一个 javascript jquery 函数 其中输入是数字 i 它是 select 选项的值之一 该功能会
  • R 在 Leaflet 中使用热图

    我有一个运行 Shiny 的 Linux 机器 我正在尝试根据演示获取传单运行的代码here https rpubs com bhaskarvk leaflet heatmap and here http leaflet github io
  • getRealPath() 返回 false(Laravel 5.2 和图像干预)

    上传图片时 getRealPath 总是返回false image file request gt file image file image file gt getRealPath gt FALSE 这是结果dd image file 另
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • 使用 XCode 增加堆栈大小

    我在Linux上开发了一个命令行应用程序 需要增加其堆栈 在 Linux 上我只是使用了解决方法 ulimit s unlimited在运行程序之前 在 Mac OS X 上 使用 G 命令行 我添加到编译选项 Wl stack size
  • 使用代码清理时在 Resharper 中禁用/自定义注释(重新)格式化

    有没有办法定义如何使用 Resharper 6 清理 注释 我没有找到解决这个问题的方法 代码清理之前
  • 为什么 IntelliSense 无法将我的查询所选项目识别为元素?

    Problem 我试图弄清楚为什么当我使用以下命令访问 HTML 元素时 VSCode 的 IntelliSense 不会建议元素对象属性 document querySelector 每当我使用document querySelector
  • 重试 Javascript.Promise.reject 有限次数或直到成功

    我有一个函数说myMainFunction从客户端调用 然后调用mypromisified功能 设想 mypromisified函数可能会间歇性失败 我需要延迟 以指数增长 调用此函数 直到成功或达到最大尝试次数 到目前为止我所拥有的 以下