Rust 返回异步移动块中的任何内容
所以我实现了这个代码示例,并对它做了一些修改。现在看起来是这样的:Rust 返回异步移动块中的任何内容,rust,closures,Rust,Closures,所以我实现了这个代码示例,并对它做了一些修改。现在看起来是这样的: pub async fn loadAllSNPData(&mut self, client: &Client) { let bodies = stream::iter(&self.snps) .map(|snp| { let url = format!("https://ncbi.gov/?db=snp&id={}",snp.identifier
pub async fn loadAllSNPData(&mut self, client: &Client) {
let bodies = stream::iter(&self.snps)
.map(|snp| {
let url = format!("https://ncbi.gov/?db=snp&id={}",snp.identifier);
let client = &client;
async move {
let resp = client.get(&url).send().await?;
let rawJson = resp.text().await;
// parse json
let json: Value = serde_json::from_str(&rawJson).expect("JSON was not well-formatted");
Ok((json,snp))
}
})
.buffer_unordered(PARALLEL_REQUESTS);
bodies
.for_each(|b| {
async {
match b {
Ok(b) => println!("Got {} bytes", b),
Err(e) => eprintln!("Got an error: {}", e),
}
}
})
.await;
}
在我想要返回与包含文本的rawJson
-变量不同的东西之前,一切都很正常。我想将解析后的json和相应的snp元素返回给另一个函数,然后该函数过滤json对象中的一些信息,并将其存储在相应的snp对象中。但无论何时更改返回的对象,都会出现以下错误:
错误[E0277]:?
运算符只能用于
返回结果
或选项
然后,它继续将整个异步移动
-块标记为错误根源。我该怎么做才能归还不同的东西呢
编辑:我现在返回Ok((json,snp))并获取
错误[E0698]:必须知道此字段中的内部类型async fn
body
上下文
如错误所述,仅当
异步
块的返回值是结果
或选项
时,才能使用?
。rawJson
的类型是一个结果
,因此当您返回它时,它工作正常。但是,您现在试图返回一个元组,因此它抱怨您不能再使用?
。解决这个问题的方法是返回Ok((json,snp))
。是有道理的,但我仍然有一些想法。如果我返回Ok((json,snp))我得到错误[E0698]:异步fn正文中的类型在此上下文中必须是已知的
,并且无法推断枚举结果上声明的类型参数E的类型
指向Ok
Hmm,是否明确指定snp
参数的类型实际上有帮助,我认为问题在于它无法推断返回结果中的错误类型。您可以通过返回Ok((json,snp))作为reqwest::Result
来解决这个问题。这就差不多了<代码>Ok((json,snp))作为reqwest::Result是一个非常通用的解决方案,对我来说非常有效。
Ok((json,snp))
^^ cannot infer type for type parameter `E` declared on
the enum `Result`