我试图在查找谓词内使用异步。可以使用find方法在迭代器中查找元素,如下所示:
let element = some_elements.iter().find(|element| {
// some_async_method(element).await;
// true or false based on some logic
});
在我的例子中,我需要调用异步方法作为查找逻辑的一部分。然而,当我使用await时,我最终得到了await不能在非异步块中调用的错误,这是预期的。当我尝试使我的函数async如下:
let element = some_elements.iter().find(|element| async move{
// some_async_method(element).await;
// true or false based on some logic
});
我得到错误:期望的bool
,发现不透明类型
我试图使用人造丝,但找不到我正在寻找的例子。
你可以用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;