13 个版本 (7 个稳定版)
2.0.0 | 2022 年 9 月 17 日 |
---|---|
1.3.1 | 2022 年 2 月 2 日 |
1.3.0 | 2021 年 8 月 14 日 |
1.2.1 | 2021 年 4 月 24 日 |
0.3.0 | 2015 年 4 月 13 日 |
#69 在 Rust 模式 中
每月下载量 298,078
用于 82 个 crate (56 个直接使用)
25KB
478 行
retry
Crate retry
提供用于重试可能失败的操作的实用工具。
文档
retry 在 docs.rs 上提供了全面的文档。
法律
retry 在 MIT 许可协议下发布。请参阅 LICENSE
。
lib.rs
:
Crate retry
提供用于重试可能失败的操作的实用工具。
用法
使用 retry
函数重试操作。 retry
接受一个 Duration
迭代器和一个返回 Result
(或 OperationResult
;见下文)的闭包。迭代器用于确定每次未成功尝试后等待多长时间,以及放弃并返回 Result::Err
之前尝试多少次。闭包确定最终成功的值或错误值,该值可以立即返回或用于指示操作应重试。
任何实现了 Iterator
并具有关联 Item
类型为 Duration
的类型都可以用于确定重试行为,尽管在 delay
模块中提供了一些有用的实现,包括固定延迟和指数退避。
let mut collection = vec![1, 2, 3].into_iter();
let result = retry(Fixed::from_millis(100), || {
match collection.next() {
Some(n) if n == 3 => Ok("n is 3!"),
Some(_) => Err("n must be 3!"),
None => Err("n was never 3!"),
}
});
assert!(result.is_ok());
可以使用 Iterator
API 来限制或修改延迟策略。例如,限制重试次数为 1。
let mut collection = vec![1, 2, 3].into_iter();
let result = retry(Fixed::from_millis(100).take(1), || {
match collection.next() {
Some(n) if n == 3 => Ok("n is 3!"),
Some(_) => Err("n must be 3!"),
None => Err("n was never 3!"),
}
});
assert!(result.is_err());
为了处理致命错误,返回 OperationResult
,它类似于 Result
,但增加了一个第三个情况来区分应该导致重试和应该立即返回的错误,从而停止重试行为。(内部始终使用 OperationResult
,将传递给 retry
并返回普通 Result
的闭包转换为 OperationResult
。)
use retry::OperationResult;
let mut collection = vec![1, 2].into_iter();
let value = retry(Fixed::from_millis(1), || {
match collection.next() {
Some(n) if n == 2 => OperationResult::Ok(n),
Some(_) => OperationResult::Retry("not 2"),
None => OperationResult::Err("not found"),
}
}).unwrap();
assert_eq!(value, 2);
如果你的操作需要知道尝试了多少次,请使用 retry_with_index
函数。这和 retry
一样工作,但会将当前尝试的次数作为参数传递给闭包。
let mut collection = vec![1, 2, 3, 4, 5].into_iter();
let result = retry_with_index(Fixed::from_millis(100), |current_try| {
if current_try > 3 {
return OperationResult::Err("did not succeed within 3 tries");
}
match collection.next() {
Some(n) if n == 5 => OperationResult::Ok("n is 5!"),
Some(_) => OperationResult::Retry("n must be 5!"),
None => OperationResult::Retry("n was never 5!"),
}
});
assert!(result.is_err());
功能
random
:提供一些随机延迟工具(默认启用)
依赖项
~73KB