繁体   English   中英

如何在 rust 中异步运行另一个 function?

[英]How to run another function as async in rust?

作为一名 JS 开发人员,我很难理解 rust 中的错误处理。 尤其是异步性。 继承人使用async-std调用异步刮刀 function 的另一个 stackoverflow 问题的一些代码:

use std::fs::File;
use std::io::{self, BufReader};
use std::io::BufRead;
//use async_std::task;

async fn scrape<R: BufRead>(reader: &mut R) -> io::Result<()> {
    reader.lines()
        .try_for_each(|line_result| line_result.and_then(|line| Ok(println!("{}", line))))?;
    Ok(())
}

fn main() {
    let file_result = File::open("wlist.txt");
    let file;
    match file_result {
       Ok(f) => file = f,
       Err(e) => { println!("File open error! {}", e); return; },
    }
    let mut reader = BufReader::new(file);

    match scrape(&mut reader) {
        Ok(_) => println!("done!"),
        Err(e) => println!("File read error! {}", e),
    }
}

我正在尝试以异步方式调用scrape ,例如:

    task::block_on(match scrape(&mut reader) {
        Ok(_) => println!("done!"),
        Err(e) => println!("File read error! {}", e),
    })

但它与the trait std::future::Future is not implemented for ()

代码片段有什么问题? 如何尽可能减少对代码的 rest 的修改,以异步方式运行刮板?

通常,您只能从异步上下文调用异步函数,除非您使用执行程序中的block_onspawn函数或类似函数。

创建异步上下文的最简单方法是async块。 然后,您需要使用.await运算符正确链接异步:

    task::block_on(async {
        match scrape(&mut reader).await {
            Ok(_) => println!("done!"),
            Err(e) => println!("File read error! {}", e),
        }
    })

对于更复杂的代码,您将有一个可能失败的异步 function 调用另一个也可能失败的异步 function。 在这些情况下,写other_async_func().await? 同时等待并转发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM