rust - 如何在不使用 OptionFuture 的情况下在 `Option::and_then` 或 `Option::map` 的闭包中使用 async/await?
问题描述
我想运行类似下面的代码:
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
.
没有更好的办法吗?
解决方案
我相信惯用的方法是简单地使用match
:
let user_id = match session_token {
Some(session_token) => get_user("sessiontoken").await.map(|user| user.id),
None => None,
};
推荐阅读
- jwt - 从 JWT 迁移到 Identity Server 4,部署后无需重新登录网站用户
- ios - 带有 UIView 的 UIScrollView 无法选择任何子视图项
- firebase - Firestore 循环的数据插入问题
- javascript - 后退按钮不适用于简单的 SPA 设置
- python - 为什么生成器列表只返回最后一个生成器的元素?
- javascript - 将 javascript 对象输出为 html 表
- kotlin - 尝试使用 Renderscript 裁剪位图失败,出现无效插槽索引错误
- laravel - 安装 sanctum 时 Laravel Composer 错误:与合同冲突
- ios - React Native 在调试时可以正常启动,但不能在发布时崩溃
- c - 即使代码的逻辑似乎正确,使用递归检查字符串是否为回文也不起作用