2 个版本
使用旧的 Rust 2015
0.1.1 | 2016 年 12 月 27 日 |
---|---|
0.1.0 | 2016 年 12 月 27 日 |
#15 在 #machines
10KB
84 行
联合未来
在编写异步代码时,使用令人惊叹的 futures 库,有时需要编写分支代码。例如,您的代码可能在某些时候有立即答案 some,在这种情况下,您希望返回一个立即解决的 future,或者如果无法立即得到答案,可能需要调用数据库。
如 教程 中所述,对于这种情况有多种选择,其中最受欢迎的是创建一个 BoxedFuture
。这种方法的缺点包括运行时分配 trait 对象。由于 future trait 有一个几乎鼓励这种方法的 .boxed()
方法,因此这种方法很受欢迎。
然而,在性能要求高的场景或公开库时,显式状态机是构建 future 的首选方法。这个库使得编写既高效又易用的代码变得简单。
#[macro_use]
extern crate union_future;
extern crate futures;
use futures::*;
use futures::future::*;
// Macro will create the enum and necessary trait implementations
// for the QueryFuture. This enum will have 2 variants: Cached and Db.
union_future!(QueryFuture<u64, DbError>,
Cached => FutureResult<u64, DbError>,
Db => DbQueryFuture<u64>);
// Example code that branches, using the future created by the macro
pub fn query(db: &Db, key: &str) -> QueryFuture {
if let Some(cached_val) = check_local_cache(key) {
QueryFuture::Cached(ok(cached_val))
} else {
query_db(db, key).into()
}
}
fn check_local_cache(key: &str) -> Option<u64> {
// ...
}
fn query_db(db: &Db, key: &str) -> DbQueryFuture<u64> {
// ...
}
安装
首先,将以下内容添加到您的 Cargo.toml
[dependencies]
union-future = "0.1"
futures = "0.1"
依赖项
~53KB