如何在 Option::and_then 或 Option::map 闭包内使用 async/await 而不使用 OptionFuture?

Fil*_*rrù 9 rust async-await rust-futures

我想运行类似以下代码的代码:

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)
});
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为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);
Run Code Online (Sandbox Code Playgroud)

但这确实很麻烦,并且阻止我使用许多对选项、结果或类似操作进行操作的函数,例如Option::and_then.

难道就没有更好的办法了吗?

kmd*_*eko 5

我相信惯用的方法是简单地使用match:

let user_id = match session_token {
    Some(session_token) => get_user("sessiontoken").await.map(|user| user.id),
    None => None,
};
Run Code Online (Sandbox Code Playgroud)