等待结果映射未来
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),
}
}
最简单易懂的方法是什么(无需 match
ing)?
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()
我正在使用 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),
}
}
最简单易懂的方法是什么(无需 match
ing)?
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()