我实现了一个特征Fetcher
,用于从端点(服务器,数据库等)获取特定内容,所有这些都是用期货完成的:
pub trait Fetcher {
type Content: 'static;
type Error: 'static;
fn fetch(&self, target: &str) -> Box<Future<Item = Vec<Self::Content>, Error = Self::Error>>;
fn fetch_size<'a>(
&'a self,
size: usize,
) -> Box<Future<Item = Vec<Self::Content>, Error = Self::Error> + 'a> {
let target = "some_endpoint";
let fetch_items = move |mut result: Vec<Self::Content>| {
self.fetch(target).and_then(move |items| {
result.extend(items.into_iter());
if result.len() > size {
Ok(Loop::Break(result))
} else {
Ok(Loop::Continue(result))
}
})
};
let x = loop_fn(Vec::new(), fetch_items);
Box::new(x)
}
}
我有一台服务器,即使可用项目较大,也会以最多100个固定项目进行响应。我需要特定大小的结果,因此我实现了fetch_size
函数,该函数使用futures crate
的{{3}}返回未来循环。 loop_fn
获取初始状态,在本例中为空向量和表示迭代操作的闭包。
fetch_items
闭包取出一批物品,并检查result
vec的大小是否超过要求的大小。如果确实如此,则循环应该中断,否则loop_fn
应该再次调用fetch_items
。
由于fetch_items
闭包借用self
来执行fetch
,我需要将所有权移至闭包,但这需要终身约束,我将在{{1到fetch_size
。如果在同一范围内创建并删除&self
的实例,则无法使用fetch_size
作为未来链的返回值,因为只要{{{} {}未来依赖于现有Fetcher
1}}正在创建Fetcher
:
fetch_size
有没有办法在没有生命限制的情况下执行未来的循环?我尝试使用// a Dummy struct
pub struct DummyImpl {}
impl Fetcher for DummyImpl {
type Content = String;
type Error = String;
fn fetch(&self, target: &str) -> Box<Future<Item = Vec<Self::Content>, Error = Self::Error>> {
// dummy impl
Box::new(futures::future::ok((vec!["".to_string()])))
}
}
fn main() {
let mut core = Core::new().unwrap();
let dummy = DummyImpl {};
let work = dummy.fetch("some_endpoint").and_then(|content| {
// represents a different Fetcher impl
let dummy_2 = DummyImpl {};
// fails due bound to lifetime of dummy_2
dummy_2.fetch_size(100usize)
// works:
// let first = content.first().unwrap();
// dummy_2.fetch(first.as_str())
});
}
,但也无法使用它。