#tokio #async #refresh #duration #automatic #value #exit

async-refresh

在给定的时间后自动异步创建值

1 个不稳定版本

0.1.0 2021年9月2日

#959 in 异步

MIT 许可证

17KB
297 代码行

async-refresh

Rust

在给定的时间后自动创建值。刷新将在单独的任务中异步进行。值通过 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
  • 提供更新时的参数
  • 使用 buildtry_build 方法生成一个新的 Refreshed 值,该值将定期异步调用
  • 使用 Refreshed 上的 get 方法在 Arc 中获取当前值

内部,Refreshed 使用 Arc,因此克隆是安全且经济的。当最后一个对该 Arc 的引用被丢弃时,刷新循环将自动终止。

请注意,如果您的刷新函数或 future 发生恐慌,程序将继续运行,但值将不再更新。强烈建议使用非恐慌操作。

依赖关系

~2.5–4MB
~61K SLoC