rust - 对具有不同错误类型的两个独立期货进行排序
问题描述
我的代码排列如下:-
let done = client_a.
.get_future(data)
.then(move |result| {
// further processing on result
spawn a future here.
});
tokio::run(done);
现在我有另一个未来,我想处理它的结果以及“结果处理”。然而,未来完全独立于client_a
这意味着:-
- 两者都可能有不同的错误类型。
一个人的失败不应该阻止另一个人。
let done = client_a. .get_future(data) .then(move |result| { // how to fit in // client_b.get_future // here // further processing on both results spawn third future here. }); tokio::run(done);
解决方案
如果错误和项目类型都是异质的,并且您知道要链接多少个期货,那么最简单的方法是链接成一个绝对可靠的Future
(因为这就是您剩下的未来的真实情况),其Item
类型是所有中间结果的元组.
这可以通过简单的链接相对简单地实现:
let future1_casted = future1.then(future::ok::<Result<_, _>, ()>);
let future2_casted = future2.then(future::ok::<Result<_, _>, ()>);
let chain = future1_casted
.and_then(|result1| future2_casted.map(|result2| (result1, result2)));
最终的期货类型是一个包含所有期货结果的元组。
如果您不知道要链接多少期货,则需要加强您的要求并提前明确了解期货的可能回报类型。由于没有宏就不可能生成任意大小的元组,因此您需要将中间结果存储到需要同质类型的结构中。
要解决此问题,需要定义包含类型的元组,例如用于错误:
#[derive(PartialEq, Debug)]
pub enum MyError {
Utf16Error(char::DecodeUtf16Error),
ParseError(num::ParseIntError)
}
impl From<char::DecodeUtf16Error> for MyError {
fn from(e: char::DecodeUtf16Error) -> Self {
MyError::Utf16Error(e)
}
}
impl From<num::ParseIntError> for MyError {
fn from(e: num::ParseIntError) -> Self {
MyError::ParseError(e)
}
}
从那里开始,组合期货遵循与以前相同的路线 - 将一个错误的未来变成一个绝对可靠的Result<_, _>
回报,然后组合成一个结构,如 a Vec
withfuture::loop_fn()