Rust中`.await?`语法是什么?为何能这样使用?
关于
.await?的用法解析 你之前的误解在于:.await本身只是用来等待异步任务完成的操作,但它等待的异步任务的最终返回值完全可以是Result类型,这就是为什么能把.await和?结合起来用。
拿你贴的reqwest代码举例:
client.get(...).header(...).send()会返回一个异步任务(实现Futuretrait的类型),这个任务完成后给出的结果是Result<reqwest::Response, reqwest::Error>——也就是说,异步请求可能成功拿到响应,也可能失败返回错误。- 调用
.await就是等待这个异步任务结束,拿到它的最终结果(也就是那个Result),这时候用?就和普通Result用?完全一样:如果是Ok就提取里面的Response继续往下走,如果是Err就直接把错误返回给当前函数的调用者。 - 后面的
.json::<GETAPIResponse>()同理,它返回的异步任务完成后给出的是Result<GETAPIResponse, reqwest::Error>,.await拿到这个Result后再用?提取最终的API响应结构体。
再举个更简单的例子帮你理解:
// 一个返回Result的异步函数 async fn fetch_number() -> Result<i32, &'static str> { Ok(42) } async fn run() -> Result<(), &'static str> { // fetch_number()返回Future,.await后拿到Result<i32, &str>,用?提取Ok值 let num = fetch_number().await?; println!("拿到的数字:{}", num); Ok(()) }
本质上,.await的作用是把异步任务的最终结果“取出来”,如果这个结果是Result,那自然可以用?来处理错误。
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

