如何转换未来的输出?

时间:2019-06-13 15:38:26

标签: asynchronous rust rust-tokio

对于Tokio的期货,如果要转换因果关系链中的Error,则可以使用from_err::<NewType>()。我想要相同的功能,但要使用Item中的impl Future<Item = (), Error = ()>

我的一些代码示例:

let mut async_series_client = vec![];
async_series_client.push(Box::new(
    SocketHandler::connect(
        port,
        addr,
        handle,
        tx_wave,
        tx_linear,
        KcpSessionManager::new(&handle2).unwrap(),
    )
    .from_err::<HyxeError>()
    .join(tube)
    .map_err(|mut err| err.printf()),
));

这将返回((),())(其他问题:是否由于联接而返回()的元组?)。我希望它只返回()。我该怎么办?

1 个答案:

答案 0 :(得分:2)

使用Future::map。这与Option::mapResult::mapIterator::map平行:

use futures::{future, Future}; // 0.1.27

fn some_future() -> impl Future<Item = i32, Error = ()> {
    future::ok(42)
}

fn change_item() -> impl Future<Item = String, Error = ()> {
    some_future().map(|i| i.to_string())
}

另请参阅Stream::map


async / await语法稳定后,您 可能不再需要再次使用此组合器,因为您可以使用常规方法:

async fn some_future() -> i32 {
    42
}

async fn change_output() -> String {
    some_future().await.to_string()
}

Result::map

async fn some_future() -> Result<i32, ()> {
    Ok(42)
}

async fn change_output() -> Result<String, ()> {
    some_future().await.map(|i| i.to_string())
}

但是它仍然存在:

use futures::{Future, FutureExt}; // 0.3.0-alpha.16

async fn some_future() -> i32 {
    42
}

fn change_output() -> impl Future<Output = String> {
    some_future().map(|i| i.to_string())
}