面试题答案
一键面试- 单个异步函数
fetch_data
的错误处理:- 在Rust中,
async
函数默认返回Result
类型是一个好的实践。假设fetch_data
返回的数据类型是String
,可以这样定义:
use std::io::Error; async fn fetch_data() -> Result<String, Error> { // 模拟网络请求 Ok("data from network".to_string()) }
- 在调用
fetch_data
的地方,可以使用?
操作符来优雅地处理错误。例如:
#[tokio::main] async fn main() -> Result<(), Error> { let data = fetch_data().await?; println!("Fetched data: {}", data); Ok(()) }
- 在Rust中,
- 多个异步任务并发执行时的错误处理:
- 可以使用
tokio::join!
宏来并发执行多个异步任务。如果这些任务都返回Result
类型,可以通过自定义函数来统一处理错误。 - 假设有两个异步函数
fetch_data1
和fetch_data2
,定义如下:
async fn fetch_data1() -> Result<String, Error> { Ok("data1 from network".to_string()) } async fn fetch_data2() -> Result<String, Error> { Ok("data2 from network".to_string()) }
- 可以这样并发执行并处理错误:
fn handle_errors<T, E>(results: Vec<Result<T, E>>) -> Result<Vec<T>, E> { let mut successes = Vec::new(); for result in results { match result { Ok(data) => successes.push(data), Err(e) => return Err(e), } } Ok(successes) } #[tokio::main] async fn main() -> Result<(), Error> { let (result1, result2) = tokio::join!(fetch_data1(), fetch_data2()); let all_results = handle_errors(vec![result1, result2])?; for data in all_results { println!("Fetched data: {}", data); } Ok(()) }
- 另外,如果使用
futures::future::join_all
,处理方式类似:
use futures::future::join_all; #[tokio::main] async fn main() -> Result<(), Error> { let futures = vec![fetch_data1(), fetch_data2()]; let results = join_all(futures).await; let all_results = handle_errors(results)?; for data in all_results { println!("Fetched data: {}", data); } Ok(()) }
- 可以使用
上述代码基于Tokio运行时,fetch_data
函数只是简单模拟网络请求返回数据或错误。在实际网络请求中,可能会使用如reqwest
这样的库来实现真实的网络请求。