等待结果映射未来

tor*_*eyy 6 future rust

我正在使用未来的库,我有一个实现的未来Future<T, E>.我想这个未来的函数映射FnOnce(T) -> D在那里D: From<E>.现在,当我想要wait()这个未来的finsih时,我会得到一个Result<Result<T, E>, D>,但是我想要一个Result<T, D>.

以下是一些示例代码,以便更好地理解:

struct ReadError;

enum DownloadError {
    Read(ReadError),
    Parse(ParseError),
}

impl From<ReadError> for DownloadError { ... }

fn parse(bytes: [u8; 4]) -> Result<i32, DownloadError> { ... }

fn map_and_wait<F: Future<Item = [u8; 4]; Error = ReadError>>(f: F) -> Result<i32, DownloadError> {
    match f.map(|x| parse(x)).wait() {
        Ok(Ok(x)) => Ok(x),
        Ok(Err(x)) => Err(x.into()),
        Err(x) => Err(x),
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做最简单,最容易理解的方式是什么(没有match)?

tor*_*eyy 4

这是用于 futures v0.1(旧的,实验性的)

我找到了问题的答案:

您可以首先wait在 future 上完成,使用?返回潜在的错误,然后应用parse它:

parse(f.wait()?)
Run Code Online (Sandbox Code Playgroud)

这应该具有相同的语义,因为在轮询时,Future返回的 bymap执行其闭包。另一个解决方案是映射可能的错误并使用and_then

f.map_error(|x| x.into()).and_then(|x| parse(x)).wait()
Run Code Online (Sandbox Code Playgroud)