[英]How to run another function as async in rust?
作为一名 JS 开发人员,我很难理解 rust 中的错误处理。 尤其是异步性。 继承人使用async-std
调用异步刮刀 function 的另一个 stackoverflow 问题的一些代码:
use std::fs::File;
use std::io::{self, BufReader};
use std::io::BufRead;
//use async_std::task;
async fn scrape<R: BufRead>(reader: &mut R) -> io::Result<()> {
reader.lines()
.try_for_each(|line_result| line_result.and_then(|line| Ok(println!("{}", line))))?;
Ok(())
}
fn main() {
let file_result = File::open("wlist.txt");
let file;
match file_result {
Ok(f) => file = f,
Err(e) => { println!("File open error! {}", e); return; },
}
let mut reader = BufReader::new(file);
match scrape(&mut reader) {
Ok(_) => println!("done!"),
Err(e) => println!("File read error! {}", e),
}
}
我正在尝试以异步方式调用scrape
,例如:
task::block_on(match scrape(&mut reader) {
Ok(_) => println!("done!"),
Err(e) => println!("File read error! {}", e),
})
但它与the trait std::future::Future is not implemented for ()
代码片段有什么问题? 如何尽可能减少对代码的 rest 的修改,以异步方式运行刮板?
通常,您只能从异步上下文调用异步函数,除非您使用执行程序中的block_on
或spawn
函数或类似函数。
创建异步上下文的最简单方法是async
块。 然后,您需要使用.await
运算符正确链接异步:
task::block_on(async {
match scrape(&mut reader).await {
Ok(_) => println!("done!"),
Err(e) => println!("File read error! {}", e),
}
})
对于更复杂的代码,您将有一个可能失败的异步 function 调用另一个也可能失败的异步 function。 在这些情况下,写other_async_func().await?
同时等待并转发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.