1 个不稳定版本
0.1.0 | 2021年9月2日 |
---|
#959 in 异步
17KB
297 代码行
async-refresh
在给定的时间后自动创建值。刷新将在单独的任务中异步进行。值通过 Arc
提供。当值不再被程序的其他部分引用时,刷新任务将自动退出。
use std::convert::Infallible;
use async_refresh::Refreshed;
use tokio::time::Duration;
#[tokio::main]
async fn main() {
let refreshed_time: Refreshed<String, Infallible> = Refreshed::builder()
.duration(Duration::from_millis(100))
.error(|err| {
eprintln!("Error while updating time: {:?}", err);
})
.success(|new_val| {
eprintln!("Got a new time: {}", new_val);
})
.exit(|| {
eprintln!("No longer refreshing");
})
.build(|is_refresh| async move {
let now = std::time::SystemTime::now();
format!("now == {:?}, is_refresh == {}", now, is_refresh)
})
.await;
println!(
"Created a new Refreshed, value is: {}",
refreshed_time.get()
);
tokio::time::sleep(Duration::from_secs(1)).await;
println!(
"Dropping the Refreshed value, current time: {}",
refreshed_time.get()
);
std::mem::drop(refreshed_time);
tokio::time::sleep(Duration::from_secs(1)).await;
}
上面的代码将产生如下输出
Created a new Refreshed, value is: now == SystemTime { intervals: 132750230547424477 }, is_refresh == false
Got a new time: now == SystemTime { intervals: 132750230548504204 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230549594570 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230550668472 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230551768836 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230552849966 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230553943810 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230555062564 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230556144744 }, is_refresh == true
Got a new time: now == SystemTime { intervals: 132750230557223529 }, is_refresh == true
Dropping the Refreshed value, current time: now == SystemTime { intervals: 132750230557223529 }, is_refresh == true
No longer refreshing
使用此 crate 的基本工作流程是
- 使用
builder()
创建一个新的Builder
值 - 提供更新时的参数
- 使用
build
或try_build
方法生成一个新的Refreshed
值,该值将定期异步调用 - 使用
Refreshed
上的get
方法在Arc
中获取当前值
内部,Refreshed
使用 Arc
,因此克隆是安全且经济的。当最后一个对该 Arc
的引用被丢弃时,刷新循环将自动终止。
请注意,如果您的刷新函数或 future 发生恐慌,程序将继续运行,但值将不再更新。强烈建议使用非恐慌操作。
依赖关系
~2.5–4MB
~61K SLoC