函数run_av_check
接收到一个填充有URL的向量,需要使用reqwest进行调用。遍历URL给我一个错误,即借入的值寿命不长。我的理解是,只要使用check_availability
循环在run_av_check
中调用的所有URL的for
都没有完成,run_av_check
函数就不会完成,因此变量URL在所有check_availibility
调用的运行期间仍应存在。
我已经阅读了Tokio和Rust的文档,但无法找到这种现象发生的方式和原因的线索。为什么会弹出错误,需要进行哪些更改才能使它正常运行,无论是从程序角度还是从我的思维角度而言?
async fn check_availability(host: &str) -> Result<reqwest::StatusCode, reqwest::Error> {
// ... building url
match client.get(&url).send().await {
Ok(r) => Ok(r.status()),
Err(_e) => Ok(reqwest::StatusCode::GATEWAY_TIMEOUT),
}
}
async fn run_av_check(urls: Vec<std::string::String>) -> Result<AvResponse, AvError> {
let mut av_urls: Vec<std::string::String> = vec![];
let mut s: std::string::String = "".to_string();
let mut attributes = Vec::new();
for url in urls.iter() {
attributes.push(("instance", url));
let resp = tokio::task::spawn(check_availability(url));
// ... processing result
let res = AvResponse {
av_urls,
prom_details: s,
};
Ok(res)
}
}
答案 0 :(得分:-1)
问题是您正在tokio::task::spawn(check_availability(url));
此函数使用only 'static
references,但是您的url
引用本地向量urls
。
您需要使check_availability
接受String
类型(fn check_availability(host: String)
)并像let resp = tokio::task::spawn(check_availability(url.to_string()));
一样调用它