重试
对失败操作的指数策略和自定义策略进行总结 .
安装
npm install retry
当前状况
该模块已经测试完毕,准备使用.
教学
下面的例子将重试一个潜在的失败 dns.resolve 操作
10 使用指数式后退策略。 默认设置中, 此
表示最后一次尝试是在 17 minutes and 3 seconds。 。 。 .
var dns = require('dns');
var retry = require('retry');
function faultTolerantResolve(address, cb) {
var operation = retry.operation();
operation.attempt(function(currentAttempt) {
dns.resolve(address, function(err, addresses) {
if (operation.retry(err)) {
return;
}
cb(err ? operation.mainError() : null, addresses);
});
});
}
faultTolerantResolve('nodejs.org', function(err, addresses) {
console.log(err, addresses);
});
当然,你也可以配置进入指数化的因素 备份。 关于所有可用的设置, 请参看下面的 API 文件 . 当前尝试是一个表示迄今尝试次数的输入.
var operation = retry.operation({
retries: 5,
factor: 3,
minTimeout: 1 * 1000,
maxTimeout: 60 * 1000,
randomize: true,
});
API 密码
retry. expert ([选项])
创建新 RetryOperation 对象. options 与 retry.timeouts()是因为 options,加上三个补充:
forever: 是否永远重试,默认为false。 。 。 .unref编号: 是否 未读 设置 Timeout 的,默认为false。 。 。 .maxRetryTime:允许再试操作运行的最大时间(以毫秒计). 默认是Infinity。 。 。 .
retry.timeout([选项]) 重试
返回超时数组 。 永远 options 返回值为
毫秒长. 若为 options 是数组,返回该数组的副本.
options 可包含以下任一密钥的联署材料对象:
retries:重试操作的最大次数. 默认是10设置此选项1表示do it once, then retry it once。 。 。 .factor:要使用的指数系数。 默认是2。 。 。 .minTimeout:第一次重试开始前的毫秒数. 默认是1000。 。 。 .maxTimeout:两个回转间的最大毫秒数. 默认是Infinity。 。 。 .randomize:通过乘以因数在1改为2默认为false。 。 。 .
用于计算单个超时的公式是:
Math.min(random * minTimeout * Math.pow(factor, attempt), maxTimeout)
来看看 本条 对方法作出更好的解释.
如果你想调谐你的 factor 编号 : times 尝试上次重试的设置
一段时间后,可以使用wolfram alpha. 例如顺序
调用 10 尝试 5 minutes您可以使用此等式 :

解释从左到右的各种值:
k = 0 ... 9编号:retries价值(10)1000编号:minTimeout数值(1 000)x^k:没有必要改变这一点,x将会成为你的因子5 * 60 * 1000: 以毫秒( 5分钟) 重试所需时间总数
为了让你更容易一点,使用wolfram alpha来进行计算:
http://www.wolframalpha.com/input/?i=sum%5B1000*x^k%2C+{%2C+0%2C+9}%5D+%3D+5+*+60+*+1000
重新尝试. 创建 Timeout( 尝试, 选择)
返回一个新的 timeout (整数以毫秒为单位)基于给定参数.
attempt 是代表一个整数,为此应重新计算超时。 如果你的重试操作被执行4次 你有一个尝试和3次重试。 如果您想要计算新的超时, 请设置 attempt 至 4(尝试为零索引).
opts 可包含 factor, (中文(简体) ), minTimeout, (中文(简体) ), randomize (布尔)和 maxTimeout. 以上记录.
retry.createTimeout() 用于内部 retry.timeouts() 并且是公开的,以便您能够创建用于重新插入某个项的自己的超时程序 问题13。 。 。 .
retry. wrap(obj, [选项], [方法名])
环绕 obj 与重试。 您可以选择通过操作选项和
需要被包裹的一系列方法名称.
retry.wrap(obj)
retry.wrap(obj, ['method1', 'method2'])
retry.wrap(obj, {retries: 3})
retry.wrap(obj, {retries: 3}, ['method1', 'method2'])
这个 options 对象可以选择通常调用到的任何选项 retry.operation 能摄取.
新建重试操作( 超时, [选项])
创建新 RetryOperation 地点 timeouts 是每个值所在的数组
以毫秒计的超时.
可用的选项 :
forever: 是否永远重试,默认为false。 。 。 .unref: 向 Wether 移动 未读 设置 Timeout 的,默认为false。 。 。 .
若为 forever 真实的,会发生以下变化:
RetryOperation.errors()将只输出一个项的数组:最后一个错误.RetryOperation将重复使用timeouts阵列。 一旦其全部超时被用完后,会以第一次超时重启,再使用第二次等.
重试操作. errors ()
返回已传递到的所有错误的数组 retryOperation.retry() 目前为止 这个
返回数组中,有按时间顺序排列的错误被传送到
retryOperation.retry(),这意味着第一个通过的错误是指数零,最后一个是
在最后一个索引.
重试操作。 mainError ()
引用最频繁发生的错误对象 。 错误是
比较使用 error.message 属性.
如果多个错误消息发生时间相同, 则最后一个错误 返回带有该消息的对象.
如果迄今为止没有出错,则值是 null。 。 。 .
重试操作. attoption( fn, 超时) Ops
定义函数 fn 即是重审后执行
时间马上。 这个 fn 函数可以接收可选 currentAttempt 表示执行尝试次数的回调 fn 目前为止.
可选定义 timeoutOps 具有财产的物体 timeout 单位:毫秒和财产 cb 调用函数 .
当你的重试操作需要时间超过 timeout 要执行的超时调用功能 cb 名为.
重试操作. try( fn)
这是一个别名,用于 retryOperation.attempt(fn). 这是堕落的。 请使用 retryOperation.attempt(fn) 换句话说.
重试操作. sart( fn)
这是一个别名,用于 retryOperation.attempt(fn). 这是堕落的。 请使用 retryOperation.attempt(fn) 换句话说.
重试操作. retry( 错误)
回返 false 否时 error 值,或重试的最大次数
已经达到.
否则它会回来 true,并在超时后重试操作
当前尝试编号.
重试操作. stop ()
允许您停止重试操作 。 用于在致命错误等情况下中止操作 .
重试操作. reset ()
重置操作对象的内部状态,以便您可以调用 attempt() ,它再次成为新的操作对象.
重试操作. atters ()
返回一个表示需要调用的次数的英寸 fn 在它获得成功之前.
许可证
重新试验根据麻省理工学院的许可证颁发.
更改日志
0:0.0 添加 stop 函数,多亏了@maxnachlinger.
0.9.0 添加 unref 函数,感谢@satazor.
实施重试. wrap.
0.7.0 一些错误修正并重试.createtimout() public. 固定问题 10号, (中文(简体) ), 12号,以及 13号。 。 。 .
0.6.0 为尝试()函数引入了可选时间Ops参数,该函数是一个以毫秒计的属性超时和属性 cb 调用函数的对象。 每次重试操作需要超过超时执行时,都会调用超时调用函数 cb.
0.5.0 一些小的重构.
0.4.0 更改了重试 Operation.try( ) 为重试 Operation. attrep () 。 贬去别名开始( ) 为它尝试( ) .
0.3.0 添加再试 Operation. start () 是再试 Operation.try () 的同名词.
0.2.0 添加尝试 () 函数和参数以重试 Operation.try () , 表示调用 fn () 的尝试次数 .