Rust: Async find (use await within predicate)



我试图在查找谓词内使用异步。可以使用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;

最新更新