【发布时间】:2018-11-02 21:24:10
【问题描述】:
如果我有一些要链接在一起的期货,我怎样才能使第二个链接的未来以第一个未来的结果为条件?
举一个人为的例子,我有类似的东西:
extern crate futures;
extern crate tokio_core;
use futures::{future, Future};
use tokio_core::reactor::Core;
fn add_one(x: i64) -> impl Future<Item = i64, Error = ()> {
future::ok(x).map(|x| x + 1)
}
fn double(x: i64) -> impl Future<Item = i64, Error = ()> {
future::ok(x).map(|x| x * 2)
}
fn add_one_then_double(x: i64) -> impl Future<Item = i64, Error = ()> {
future::ok(x).and_then(add_one).and_then(double)
}
fn main() {
let mut reactor = Core::new().unwrap();
println!("{:?}", reactor.run(add_one_then_double(10)).unwrap());
}
然后我怎样才能将add_one_then_double 未来更改为以add_one 未来的结果为条件,例如:
fn add_one_then_double_if_positive(x: i64) -> impl Future<Item = i64, Error = ()> {
future::ok(x).and_then(add_one).map(|v| {
if v >= 0 {
// chain the `double` future
} else {
// return `v` as the result
}
})
}
【问题讨论】:
-
我相信How do I conditionally return different types of futures?的答案已经回答了您的问题。如果您不同意,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。
-
@Shepmaster 其他问题只是答案的一部分。这里的重点是如何有条件地在一个分支中链接未来,而不是在另一个分支中。因此,作为答案的第二部分,我们需要使用
future::ok()将值不变地传递。 -
@SvenMarnach 但 OP 已经知道如何使用
future::ok,代码中提供的它的使用证明了这一点。 -
@Shepmaster 问题的其余部分表明并非如此。
-
@Shepmaster 我很高兴把它交给你。您链接的问题让我更接近答案(尽管我没有通过搜索找到它,因为我只是在寻找有条件链接的方法,而不是涉及新未来的解决方案)。斯文的回答也很有帮助,而且更接近我最终可能得到的答案。实际问题比我想象的要复杂,但我会先看看我是否可以使用
Either解决任何问题。
标签: rust rust-tokio