我想运行类似下面的代码:
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 只能在异步块或函数中使用。另一方面,如果我使用异步块,则闭包将返回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);
但这确实很麻烦,并且使我无法使用许多可以对 Options、Results 或类似内容进行操作的函数,例如Option::and_then
.
没有更好的办法吗?