asynchronous - 如何接受异步函数作为参数?
问题描述
我想复制将闭包/函数作为参数的行为和人体工程学,就像map
这样:iterator.map(|x| ...)
.
我注意到一些库代码允许传入异步功能,但是这种方法不允许我传入参数:
pub fn spawn<F, T>(future: F) -> JoinHandle<T>
where
F: Future<Output = T> + Send + 'static,
T: Send + 'static,
spawn(async { foo().await });
我希望做以下事情之一:
iterator.map(async |x| {...});
async fn a(x: _) {}
iterator.map(a)
解决方案
async
函数被有效地脱糖为返回impl Future
。一旦你知道了,就可以结合现有的 Rust 技术来接受一个函数/闭包,从而产生一个具有两种泛型类型的函数:
use std::future::Future;
async fn example<F, Fut>(f: F)
where
F: FnOnce(i32, i32) -> Fut,
Fut: Future<Output = bool>,
{
f(1, 2).await;
}
这也可以写成
use std::future::Future;
async fn example<Fut>(f: impl FnOnce(i32, i32) -> Fut)
where
Fut: Future<Output = bool>,
{
f(1, 2).await;
}
推荐阅读
- asp.net - IIS 10上的Asp.net webform Intranet站点,不断询问用户和密码
- css - SVG 标签不适用于 CSS 的背景图片
- reactjs - 如何在 React-Bootstrap/MDBReact 中使用 % 设置行/列的高度?
- python - 如果没有找到任何元素,哪种方法可以有效地输出 np.argmax(array > value) 中的最后一个值而不是 0?
- r - 使用新创建的列中的值确定 x 列是否具有正/负/不同值
- android - chrome 更新到 76+ 后 Android webview 无法绘制画布
- javascript - 如何使用 js 使无限滚动到顶部?
- java - Intellij 中的新 Spring Boot 项目构建失败
- java - 如何使用java在远程机器上拉取docker镜像?
- javascript - Chart.js:使用 autoSkip 强制显示某个标签:true