6 个版本

0.3.2 2023年7月29日
0.3.1 2023年7月28日
0.2.2 2023年7月28日
0.1.0 2023年7月11日

异步 类别中排名 #526

MIT 许可证

39KB
789 行代码(不含注释)

situwaition

situwaition 持续运行闭包,直到接收到一个 Ok(..) 或超时。

安装

cargo add situwaition                      # only sync waiting is enabled by default
cargo add situwaition --features async-std # use async-std
cargo add situwaition --features tokio     # use tokio

如果你正在手动编辑 Cargo.toml

[dependencies]
situwaition = "0.3"
#situwaition = { version = "0.3", features = [ "async-std" ] }
#situwaition = { version = "0.3", features = [ "tokio" ] }

快速入门

同步

在同步环境中使用 situwaition

use situwaition::wait_for;

// ...

    // Do some waiting
    let result = wait_for(|| {
        // Get the current value from the mutex
        if some_condition { Ok(value) } else { Err(SomeError) ]
    });

    // Act on the result
    match result {
        Ok(v) => { ... }
        Err(SituwaitionError::TimeoutError(e)) => { ... }
    }

// ...

situwaition 将持续运行函数,忽略 Error(..) 响应,直到

  • 函数解析为 Ok(..) 变体
  • 达到配置的超时时间(默认为 3 秒,每 250 毫秒检查一次)。

请参见 examples/sync.rs 中的完整示例。要运行同步示例

cargo run --example sync

Tokio

如果你使用 tokio,那么你的代码看起来像这样

use situwaition::runtime::tokio::wait_for;

// ...

    // Do some waiting
    let result = wait_for(|| async {
        // Get the current value from the mutex
        if some_condition { Ok(value) } else { Err(SomeError) ]
    });

    // Act on the result
    match result {
        Ok(v) => { ... }
        Err(SituwaitionError::TimeoutError(e)) => { ... }
    }

// ...

注意,你正在将一个 Future 工厂 传递给函数 — 一个函数/闭包 (|| { ... }),该闭包 输出 一个 Future (async { .. })。

通常的 async 使用规则适用 — 在适当的地方使用 moveArcMutex 以及其他所有权和同步原语。

请参见 examples/tokio.rs 中的完整示例。要运行 tokio 示例

cargo run --example tokio --features=tokio

async-std

如果你使用 async-std,那么你的代码看起来像这样

use situwaition::runtime::tokio::wait_for;

// ...

    // Do some waiting
    let result = wait_for(|| async {
        // Get the current value from the mutex
        if some_condition { Ok(value) } else { Err(SomeError) ]
    });

    // Act on the result
    match result {
        Ok(v) => { ... }
        Err(SituwaitionError::TimeoutError(e)) => { ... }
    }

// ...

请查看完整的示例:examples/async_std.rs。要运行 async-std 示例

cargo run --example async-std --features=async-std

详细配置

如果您想更精细地控制间隔和检查发生的次数,您可以自己创建Waiter对象

use situwaition::runtime::AsyncWaiter;
use situwaition::runtime::SyncWaiter;

// Synchronous code
SyncWaiter::with_timeout(|| { ... }, Duration::from_millis(500))?;

// Asynchronous code (either tokio or async-std)
AsyncWaiter::with_timeout(|| async { ... }, Duration::from_millis(500))?
    .exec()
    .await;

请查看SyncWaiterAsyncWaiter上的方法以获取更多选项。[链接](https://github.com/t3hmrman/situwaition/blob/3df805559e7bb82bc37c85ecdda45c7b352874dd/src/sync.rs) 和 [链接](https://github.com/t3hmrman/situwaition/blob/3df805559e7bb82bc37c85ecdda45c7b352874dd/src/runtime/mod.rs)

支持的环境

situwaition支持以下环境

名称 支持?
同步
Async w/ tokio
Async w/ async-std

开发

要开始开发situwatiion,请运行以下just目标

just setup build

为了检查您的更改是否正确,您可能需要运行

just test

如果您想查看可以运行而无需任何参数的所有目标的完整列表。

just

有几个有用的目标,例如just build-watch,它将由于cargo watch而持续构建项目。

贡献

欢迎贡献!如果您在situwaition中找到一个错误或应该包含的改进,请[创建问题](https://github.com/t3hmrman/situwaition/issues)或打开一个拉取请求。

依赖项

~1–12MB
~134K SLoC