设计思路
- 任务与回调定义:首先定义两个异步任务,一个任务用于生成结果,另一个任务根据前一个任务的结果选择不同回调函数执行。
- 错误处理:在异步任务执行过程中,可能会出现各种错误,需要使用
Result
类型来处理这些错误,并在适当的地方进行unwrap
、expect
或者match
来处理错误情况。
- 使用
tokio
运行时:利用tokio
库提供的运行时环境来调度和执行异步任务。
核心代码实现
use tokio;
// 模拟第一个异步任务,返回一个i32结果
async fn task1() -> Result<i32, String> {
// 模拟一些异步操作,这里简单返回一个值
Ok(42)
}
// 回调函数1
fn callback1(result: i32) {
println!("Callback 1 executed with result: {}", result);
}
// 回调函数2
fn callback2(result: i32) {
println!("Callback 2 executed with result: {}", result);
}
// 第二个异步任务,根据task1的结果选择回调函数
async fn task2(result: Result<i32, String>) {
match result {
Ok(value) if value % 2 == 0 => callback1(value),
Ok(_) => callback2(result.unwrap()),
Err(e) => eprintln!("Error in task1: {}", e),
}
}
#[tokio::main]
async fn main() {
let result = task1().await;
task2(result).await;
}
异步错误处理
Result
类型:在task1
函数中,返回值类型为Result<i32, String>
,其中Ok
代表成功并携带结果,Err
代表失败并携带错误信息。
match
处理:在task2
函数中,通过match
语句对task1
的结果进行处理。如果是Ok
,根据结果值选择不同的回调函数;如果是Err
,则打印错误信息。
- 全局错误处理:在
main
函数中,也可以进一步对task1
和task2
的错误进行更复杂的处理,例如记录日志、重试任务等。