6 个版本
0.3.2 | 2023年7月29日 |
---|---|
0.3.1 | 2023年7月28日 |
0.2.2 |
|
0.1.0 | 2023年7月11日 |
在 异步 类别中排名 #526
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
使用规则适用 — 在适当的地方使用 move
、Arc
、Mutex
以及其他所有权和同步原语。
请参见 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;
请查看SyncWaiter
和AsyncWaiter
上的方法以获取更多选项。[链接](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