我正在使用future库,并且我有一个实现Future<T, E>
的 future 。我想用FnOnce(T) -> D
函数映射这个 future ,其中D: From<E>
。现在,当我想要wait()
以便将来完成时,我将获得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)? 最佳答案
我找到了这个问题的答案:
您可以先在将来完成wait
,然后使用?
返回潜在的错误,然后在其上应用parse
:
parse(f.wait()?)
这应该具有相同的语义,因为当被轮询时,
Future
返回的map
将执行其关闭。另一个解决方案是映射可能的错误并使用and_then
:f.map_error(|x| x.into()).and_then(|x| parse(x)).wait()
关于rust - 等待结果映射 future ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42489053/