在Rust中,如何在闭包中调用异步方法(比如在map中)?

nlejzf6q  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(356)

我有以下内容:

struct Foo {
   id: u32,
}
impl Foo {
async fn get(id: u32) -> Result<Self, Box<dyn Error>> {
   Ok(Self{ id })
}

async fn something() {
    let ids = vec![1000, 1001];
// conceptually, I'd like to do something like this...
    let result: Vec<Foo> = ids.iter().map(|id| Foo::get(id).await.unwrap()).collect();
}

显然,我不能在附件中使用wait,我尝试了几种不同的方法来使用futures::使用iter()、map()、collect()和wait的流,但都不能通过Vec,有什么建议吗?

oprakyz7

oprakyz71#

你可以把闭包的主体封装在一个async块中,把你的ids转换成Future<Output = Foo>的vec,然后使用futures::future::join_all函数来同时等待它们(或者,使用try_join_all函数来得到一个结果,这可能更好):

extern crate futures;

use futures::future;
use std::error::Error;

struct Foo {
    id: u32,
}
impl Foo {
    async fn get(id: u32) -> Result<Self, Box<dyn Error>> {
        Ok(Self { id })
    }
}

async fn something() {
    let ids = vec![1000, 1001];
    let result: Vec<Foo> =
        future::try_join_all(ids.iter().map(|id| Foo::get(*id)))
            .await
            .unwrap();
}

Playground.

    • Edit**:显然,对于try_join_all函数,不需要使用异步块。

相关问题