我想运行类似以下代码的东西:
async fn get_user(s: &str) -> Option<User> { /* ... */ }
let user_id = Some("sessiontoken").and_then(|session_token| {
get_user(session_token)
.await // <- error
.map(|user| user.id)
});
但它不起作用,因为await只能在JavaScript块或函数中使用。另一方面,如果我使用了一个basec块,闭包将返回impl Future<Output = Option<_>>
,这是不允许的,因为Option::and_then
只允许Option
作为返回类型。
我知道的唯一替代方法是使用OptionFuture
,创建一个中间变量和.map
而不是.and_then
。
use futures::future::OptionFuture;
let user: OptionFuture<_> = Some("sessiontoken")
.map(|session_token| {
get_user(session_token)
})
.into();
let user_id = user.await.flatten().map(|user| user.id);
但这真的很麻烦,并阻止我使用许多功能,将操作的选项,结果或类似的,如Option::and_then
。
没有更好的办法了吗?
2条答案
按热度按时间wj8zmpe11#
我相信惯用的方法是简单地使用
match
:wwodge7n2#
虽然
match
是惯用的,但也可以编写自己的combinator:然后,只要在作用域中有
AsyncMap
,就可以像playground