Asynchronous 多个期货通过join_返回一个字符串,该字符串通过Reqwest获取 pub静态最大块大小:u32=1024*1024//请不要超过此值,否则Web服务器将拒绝您的请求。 pub static ENABLE_DEBUG:bool=false//如果在获取数据时遇到问题,请临时启用 发布静态最大重试次数:u8=10; fn获取\u原始\u数据\u异步(远程:远程,长度:usize,mut重试\u计数:usize)->impl Future{ 未来:懒惰(移动){ 如果长度为u32>最大块大小{ 返回Ok(无) } let(长度、大小)={ 如果最大长度\u重试\u计为usize{ 返回Ok(无) } //再试一次 获取\u原始\u数据\u异步(remote.clone(),长度,重试\u计数) })); }) }

Asynchronous 多个期货通过join_返回一个字符串,该字符串通过Reqwest获取 pub静态最大块大小:u32=1024*1024//请不要超过此值,否则Web服务器将拒绝您的请求。 pub static ENABLE_DEBUG:bool=false//如果在获取数据时遇到问题,请临时启用 发布静态最大重试次数:u8=10; fn获取\u原始\u数据\u异步(远程:远程,长度:usize,mut重试\u计数:usize)->impl Future{ 未来:懒惰(移动){ 如果长度为u32>最大块大小{ 返回Ok(无) } let(长度、大小)={ 如果最大长度\u重试\u计为usize{ 返回Ok(无) } //再试一次 获取\u原始\u数据\u异步(remote.clone(),长度,重试\u计数) })); }) },asynchronous,rust,reqwest,Asynchronous,Rust,Reqwest,考虑上面的代码。如果您输入一个任意长度的遥控器,并使用“0”进行重试计数,则假定程序返回使用reqwest下载的字符串 我想让它下载信息,然后在下载完信息后,将其返回到该函数闭包之外的调用函数。如果,在信息无法下载的情况下,我希望它再试一次(最多一定次数,由最大重试次数决定) 其思想是调用整个函数并将其存储到一个数组中。然后,无论调用了多少次此函数,都将所有未来连接()以最终连接输出 显然,将出现编译器错误。它一直告诉我execute()闭包中的函数无效。对于那些有经验的人,你当然会知道原因。所

考虑上面的代码。如果您输入一个任意长度的遥控器,并使用“0”进行重试计数,则假定程序返回使用reqwest下载的字符串

我想让它下载信息,然后在下载完信息后,将其返回到该函数闭包之外的调用函数。如果,在信息无法下载的情况下,我希望它再试一次(最多一定次数,由最大重试次数决定)

其思想是调用整个函数并将其存储到一个数组中。然后,无论调用了多少次此函数,都将所有未来连接()以最终连接输出

显然,将出现编译器错误。它一直告诉我execute()闭包中的函数无效。对于那些有经验的人,你当然会知道原因。所以,有见识的人,我问你们:我如何才能成功地设计出这个函数

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)
    }));
})
}