gpt4 book ai didi

rust - 对具有不同错误类型的两个独立 future 进行排序

转载 作者:行者123 更新时间:2023-11-29 08:28:22 24 4
gpt4 key购买 nike

我的代码排列如下:-

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

tokio::run(done);

现在我有了另一个 future ,我想在“结果处理”的同时处理它的结果。然而,那个 future 完全独立于 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 ,那么最简单的方法就是链接到一个绝对可靠的 Future 中。 (因为那才是你真正剩下的 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)));

Playground link

最终的 future 类型是一个包含所有 future 结果的元组。

如果您不知道链接了多少个 future ,则需要加强您的要求并提前明确知道您的 future 可能的返回类型。由于没有宏就不可能生成任意大小的元组,因此您需要将中间结果存储到需要同类类型的结构中。

要解决这个问题,需要定义包含您的类型的元组,例如错误:

#[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)
}
}

从那里开始,结合 future 遵循与以前相同的路线 - 将容易出错的 future 变成绝对可靠的 Result<_, _>返回,然后组合成类似 Vec 的结构与 future::loop_fn()

关于rust - 对具有不同错误类型的两个独立 future 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58037955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com