首页 > 解决方案 > 对具有不同错误类型的两个独立期货进行排序

问题描述

我的代码排列如下:-

let done = client_a.
    .get_future(data)
    .then(move |result| {
        // further processing on result
        spawn a future here.
    });

tokio::run(done);

现在我有另一个未来,我想处理它的结果以及“结果处理”。然而,未来完全独立于client_a这意味着:-

标签: rust

解决方案


如果错误和项目类型都是异质的,并且您知道要链接多少个期货,那么最简单的方法是链接成一个绝对可靠的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 Vecwithfuture::loop_fn()


推荐阅读