Rust:异步查找(在同品种器械中使用await)

omvjsjqw  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(112)

我尝试在find predicate 中使用async。我们可以使用find方法在迭代器中查找元素,如下所示:

let element = some_elements.iter().find(|element| {
  // some_async_method(element).await;
  // true or false based on some logic
});

在我的例子中,我需要调用async方法作为查找逻辑的一部分。然而,当我使用await时,我最终遇到了一个错误,即await不能在非async块中调用,这是意料之中的。当我尝试将我的函数设置为async时,如下所示:

let element = some_elements.iter().find(|element| async move{
  // some_async_method(element).await;
  // true or false based on some logic
});

我得到错误:应为bool,找到不透明类型
我试着用人造丝,但找不到我要找的例子。

smdncfj3

smdncfj31#

可以使用futures::stream::iter将迭代器转换为Stream
由于find没有在StreamExt上实现,我在下面的代码中将其替换为filter().next()

use futures::stream::StreamExt;
//…
let element = futures::stream::iter(&some_elements)
    .filter(|e| Box::pin(async move { predicate(e).await }))
    .next()
    .await;

如果你真的想异步地完成你的工作,你就必须稍微详细一点,并根据你的实际需求收集到FuturesOrdered/FuturesUnordered中:

let element = some_elements
    .iter()
    .map(|&e| async move { (predicate(e).await, e) })
    .collect::<FuturesUnordered<_>>()
    .filter_map(|(p, e)| Box::pin(async move { p.then_some(e) }))
    .next()
    .await;

相关问题