Dioxus框架中生成异步任务(Spawning Futures)

111 阅读1分钟

生成异步任务

use_resourceuse_coroutine钩子在你想要无条件地生成一个future时非常有用。然而,有时你可能只想在响应某个事件时生成一个future,比如鼠标点击。例如,如果用户点击“登录”按钮时你需要发送一个请求,你可以使用spawn

let mut response = use_signal(|| String::from("..."));

let log_in = move |_| {
    spawn(async move {
        let resp = reqwest::Client::new()
            .get("https://dioxuslabs.com")
            .send()
            .await;

        match resp {
            Ok(_data) => {
                log::info!("dioxuslabs.com responded!");
                response.set("dioxuslabs.com responded!".into());
            }
            Err(err) => {
                log::info!("Request failed with error: {err:?}")
            }
        }
    });
};

rsx! { button { onclick: log_in, "Response: {response}" } }

注意:spawn总是生成一个新的future。你很可能不想在每次渲染时都调用它。

调用spawn会给你一个JoinHandle,它允许你取消或暂停future。

生成Tokio任务

有时,你可能想要生成一个需要多线程或可能阻塞你的应用代码的硬件通信的后台任务。在这些情况下,我们可以直接从我们的future生成一个Tokio任务。对于Dioxus-Desktop,你的任务将在Tokio的多线程运行时上生成:

spawn(async {
    let _ = tokio::spawn(async {}).await;

    let _ = tokio::task::spawn_local(async {
        // 一些非Send工作
    })
    .await;
});

img

希望这个翻译对你有所帮助!如果你有任何问题或需要进一步的解释,请随时告诉我。