能否(逻辑上)将包含未来结果的结果转换为解析为结果的未来?
下面的函数有点问题,但希望它能更清晰地表达我想要实现的目标:
use std::future::Future;
fn transpose<T,U,E>(result: Result<T,E>) -> impl Future<Output = Result<U, E>>
where T: Future<Output = Result<U,E>> /* not sure if this is the correct trait bound */ {
match result {
Ok(inner) => /* a future that eventually resolves to a Result<U, E> */
Err(error) => /* a future that immediately resolves to a Result<U, E>::Err(error) */
}
}
为了提供一些背景:我发现自己需要在调用从传递给Result::map
的闭包中调用的async
函数之后执行此操作,因此这可能是我的第一个错误。
.await
实际上是解析Future,这不仅是转换。 - Ibraheem Ahmedasync
块。当调用transpose_flatten
时,.await
不会运行。 - trentresult.map(|good| good.await)
,不起作用,因为.await
是一个控制运算符,影响着直接包围它的async
函数,所以你不能将其包装在闭包中(就像return
一样)。然而,由于match
的结果已经被返回,你可以使用?
来传播错误值:result?.await
与此处的match
执行相同的操作(但如果它不是函数的最后一个表达式语句,则不会执行相同的操作)。 - trent