async / await
use gloo_timers::future::sleep;
use std::time::Duration;
async fn my_sleep(seconds: i32) {
sleep(Duration::from_desc(seconds)).await
}
async fn main_async{
// wait 3 seconds, then print "done"
my_sleep(3).await
println!("done");
}
async / await with wasm-bindgen
just make the wasm-bindgen function async. https://stackoverflow.com/questions/77717032/rust-wasm-how-to-wait-for-future-to-resolve
#[wasm_bindgen]
pub async fn read_async(id: String) -> Result<JsValue, JsValue> {
sleep(Duration::from_secs(1)).await;
let mut id = id.clone();
id.push_str(" / async");
Ok(JsValue::from_str(&id))
}
multi-threading
with spawn_local
you can just create a new thread.
#[wasm_bindgen]
pub fn add_project_to_indexdb(all_table_data: JsValue) {
wasm_bindgen_futures::spawn_local(async move {
...
});
}
If you need the result of the thread then wasm-bindgen helps with future_to_promise
.
Be sure you really need threading. A simple async fn foo()
is much easier.
#[wasm_bindgen]
pub fn open_project(&mut self) -> Promise {
let future = async move {
...
sleep(42).await;
let result = true
Ok(JsValue::from_bool(true))
};
future_to_promise(future)
}