pub static MAX_BLOCK_SIZE: u32 = 1024*1024; //Please do not exceed this value, or the webserver will deny your request.
pub static ENABLE_DEBUG: bool = false; //Enable temporarily if you're encountering problems with fetching the data
pub static MAX_RETRY_COUNT: u8 = 10;
fn get_raw_data_async(remote: Remote, length: usize, mut retry_count: usize) -> impl Future<Item=String, Error=reqwest::Error>{
futures::lazy(move || {
if length as u32 > MAX_BLOCK_SIZE {
return Ok(None)
}
let (length, size) = {
if length <= 1024 {
(1, length)
} else {
let val = (length as f64)/ (1024 as f64);
let len = math::round::ceil(val, 0) as usize;
println!("We want {}, and are using {} x 1024 to get it", length, len);
(len, 1024)
}
};
let mut url = format!("https://qrng.anu.edu.au/API/jsonI.php?length={}&type=hex16&size={}", length, size);
remote.clone().execute(reqwest::get(url.as_str()).and_then(|mut resp| {Ok(Some(resp.text().unwrap()))}).or_else(|err| {
//DC?
retry_count += 1;
if retry_count > MAX_RETRY_COUNT as usize {
return Ok(None)
}
//try again
get_raw_data_async(remote.clone(), length, retry_count)
}));
})
}
考虑上面的代码。如果你输入一个任意的遥控器,一些长度,并使用“0”作为重试计数,程序会返回使用 reqwest 下载的字符串。
我希望它下载信息,然后在信息下载完成后,将其返回给该函数闭包之外的调用函数。如果在无法下载信息的情况下,我希望它再试一次(最多一定次数,由 MAX_RETRY_COUNT 决定)。
这个想法是调用整个函数并将其存储到期货数组中。然后所有的 future 都被 join() 以最终连接这个函数被调用多少次的输出。
显然,会出现编译错误。它一直告诉我 execute() 闭包中的函数无效。对于那些有经验的人,你当然会知道为什么。所以,知识渊博的人,我问你:我怎样才能成功地制作这个功能?