等待结果映射未来

Waiting for a result mapped future

我正在使用 future 库,我有一个实现 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),
    }
}

最简单易懂的方法是什么(无需 matching)?

This is for futures v0.1 (old, experimental)

我找到了问题的答案:

你可以先wait在future上完成,使用?来return一个潜在的错误,然后在上面应用parse:

parse(f.wait()?)

这应该具有相同的语义,因为在轮询时,由 map 编辑的 Future return 会执行其关闭。另一种解决方案是映射可能的错误并使用 and_then:

f.map_error(|x| x.into()).and_then(|x| parse(x)).wait()