]> git.seodisparate.com - EN605.607.81.SP22_ASDM_Project/commitdiff
Refactor: Replace calling JS settimeout with Rust
authorStephen Seo <seo.disparate@gmail.com>
Wed, 23 Mar 2022 07:56:25 +0000 (16:56 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 23 Mar 2022 07:56:25 +0000 (16:56 +0900)
web-sys and js-sys provides ways to use "settimeout" in pure Rust which
is used instead of calling into Javascript to do "settimeout".

front_end/src/async_js_helper.js [deleted file]
front_end/src/async_js_helper.rs [deleted file]
front_end/src/main.rs
front_end/src/yew_components.rs

diff --git a/front_end/src/async_js_helper.js b/front_end/src/async_js_helper.js
deleted file mode 100644 (file)
index fdabc9b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-export function async_sleep(ms) {
-    return new Promise(resolve => setTimeout(resolve, ms));
-}
diff --git a/front_end/src/async_js_helper.rs b/front_end/src/async_js_helper.rs
deleted file mode 100644 (file)
index c6c1dd2..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-use js_sys::Promise;
-use wasm_bindgen::prelude::*;
-use wasm_bindgen_futures::JsFuture;
-
-#[wasm_bindgen(module = "/src/async_js_helper.js")]
-extern "C" {
-    fn async_sleep(ms: u32) -> Promise;
-}
-
-pub async fn rust_async_sleep(ms: u32) -> Result<(), JsValue> {
-    let promise = async_sleep(ms);
-    let js_fut = JsFuture::from(promise);
-    js_fut.await?;
-    Ok(())
-}
index 99e89e664300bbdc81c972b794782628eb54cac7..a200b4e8eacd8c84737c22d34cc6324d376c2613 100644 (file)
@@ -1,5 +1,4 @@
 mod ai;
-mod async_js_helper;
 mod constants;
 mod game_logic;
 mod html_helper;
index 0679a084fa19c284617af81871eace4672572cbc..e7897d18ddad72891e32058e7f85a4f3bdf79e81 100644 (file)
@@ -1,5 +1,4 @@
 use crate::ai::{get_ai_choice, AIDifficulty};
-use crate::async_js_helper;
 use crate::constants::{COLS, INFO_TEXT_MAX_ITEMS, ROWS};
 use crate::game_logic::{check_win_draw, WinType};
 use crate::html_helper::{
@@ -11,6 +10,10 @@ use crate::state::{BoardState, GameState, SharedState, Turn};
 use std::cell::Cell;
 use std::rc::Rc;
 
+use js_sys::Promise;
+
+use wasm_bindgen_futures::JsFuture;
+
 use yew::prelude::*;
 
 pub struct MainMenu {}
@@ -790,7 +793,22 @@ impl Component for Wrapper {
             WrapperMsg::AIChoice => {
                 // defer by 1 second
                 ctx.link().send_future(async {
-                    async_js_helper::rust_async_sleep(1000).await.unwrap();
+                    let promise = Promise::new(&mut |resolve: js_sys::Function, _reject| {
+                        let window = web_sys::window();
+                        if window.is_none() {
+                            resolve.call0(&resolve).ok();
+                            return;
+                        }
+                        let window = window.unwrap();
+                        if window
+                            .set_timeout_with_callback_and_timeout_and_arguments_0(&resolve, 1000)
+                            .is_err()
+                        {
+                            resolve.call0(&resolve).ok();
+                        }
+                    });
+                    let js_fut = JsFuture::from(promise);
+                    js_fut.await.ok();
                     WrapperMsg::AIChoiceImpl
                 });
             }