From 839e9021faa9d07734a50bed75da302298603192 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 23 Mar 2022 16:56:25 +0900 Subject: [PATCH] Refactor: Replace calling JS settimeout with Rust 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 | 3 --- front_end/src/async_js_helper.rs | 15 --------------- front_end/src/main.rs | 1 - front_end/src/yew_components.rs | 22 ++++++++++++++++++++-- 4 files changed, 20 insertions(+), 21 deletions(-) delete mode 100644 front_end/src/async_js_helper.js delete mode 100644 front_end/src/async_js_helper.rs diff --git a/front_end/src/async_js_helper.js b/front_end/src/async_js_helper.js deleted file mode 100644 index fdabc9b..0000000 --- a/front_end/src/async_js_helper.js +++ /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 index c6c1dd2..0000000 --- a/front_end/src/async_js_helper.rs +++ /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(()) -} diff --git a/front_end/src/main.rs b/front_end/src/main.rs index 99e89e6..a200b4e 100644 --- a/front_end/src/main.rs +++ b/front_end/src/main.rs @@ -1,5 +1,4 @@ mod ai; -mod async_js_helper; mod constants; mod game_logic; mod html_helper; diff --git a/front_end/src/yew_components.rs b/front_end/src/yew_components.rs index 0679a08..e7897d1 100644 --- a/front_end/src/yew_components.rs +++ b/front_end/src/yew_components.rs @@ -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 }); }