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).
Идея состоит в том, что вся эта функция вызывается и сохраняется в массиве futures.Затем все фьючерсы присоединяются (), чтобы в конечном итоге объединить выходные данные, сколько раз эта функция была вызвана.
Очевидно, что произойдет ошибка компилятора.Мне постоянно говорят, что функция в замыкании execute () недопустима.Для тех, кто опыт, вы будете знать, почему, конечно.Итак, знающий, я спрашиваю вас: как я могу успешно выполнить эту функцию?