Несколько фьючерсов через join_all, каждый из которых возвращает строку, полученную через Reqwest - PullRequest
0 голосов
/ 02 июня 2019
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 () недопустима.Для тех, кто опыт, вы будете знать, почему, конечно.Итак, знающий, я спрашиваю вас: как я могу успешно выполнить эту функцию?

...