refactor: 统一 WASM sleep 到 utils::time::sleep_ms
删除 system.rs 的私有 wasm_sleep(与 utils::time::sleep_ms 逐字相同), 6 处调用改用 crate::utils::time::sleep_ms。 ui.rs 的内联 Promise+setTimeout(50ms) 同样替换为 sleep_ms(50)。 消除 3 份 sleep 实现中的 2 份冗余副本,utils::time::sleep_ms 成为全项目 唯一的 sleep 入口(已有 native tokio + WASM 双实现)。
This commit is contained in:
parent
804bcfb7b7
commit
9e57247a2d
@ -392,13 +392,7 @@ pub fn FilterTabs(
|
||||
use wasm_bindgen::JsCast;
|
||||
|
||||
// 等待 DOM 节点更新
|
||||
let promise = js_sys::Promise::new(&mut |resolve, _| {
|
||||
if let Some(window) = web_sys::window() {
|
||||
let _ = window
|
||||
.set_timeout_with_callback_and_timeout_and_arguments_0(&resolve, 50);
|
||||
}
|
||||
});
|
||||
let _ = wasm_bindgen_futures::JsFuture::from(promise).await;
|
||||
crate::utils::time::sleep_ms(50).await;
|
||||
|
||||
if let Some(window) = web_sys::window() {
|
||||
if let Some(doc) = window.document() {
|
||||
|
||||
@ -119,24 +119,6 @@ fn format_bytes(bytes: i64) -> String {
|
||||
}
|
||||
}
|
||||
|
||||
/// WASM 端异步 sleep(用 web_sys setTimeout 包成 JsFuture,避免引入新依赖)。
|
||||
/// 非 wasm32 平台立即返回(自动刷新只在 WASM 前端用)。
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
async fn wasm_sleep(ms: u32) {
|
||||
use wasm_bindgen::JsCast;
|
||||
use wasm_bindgen_futures::JsFuture;
|
||||
let promise = js_sys::Promise::new(&mut |resolve, _| {
|
||||
web_sys::window()
|
||||
.expect("no window")
|
||||
.set_timeout_with_callback_and_timeout_and_arguments_0(
|
||||
&resolve.unchecked_into(),
|
||||
ms.try_into().unwrap(),
|
||||
)
|
||||
.expect("set_timeout failed");
|
||||
});
|
||||
let _ = JsFuture::from(promise).await;
|
||||
}
|
||||
|
||||
/// 数据库状态 tab:概览卡片 + 表清单 + 索引 Top + 活跃连接。
|
||||
/// 手动刷新按钮 + 自动刷新开关(1s/2s/5s/30s/手动,默认手动)。
|
||||
#[allow(non_snake_case)]
|
||||
@ -204,10 +186,10 @@ fn DbStatusTab() -> Element {
|
||||
if secs == 0 {
|
||||
// 手动模式:短暂 yield,让事件循环呼吸,避免忙等;
|
||||
// 用户切换到自动模式后最多等 200ms 即响应。
|
||||
wasm_sleep(200).await;
|
||||
crate::utils::time::sleep_ms(200).await;
|
||||
continue;
|
||||
}
|
||||
wasm_sleep(secs * 1000).await;
|
||||
crate::utils::time::sleep_ms(secs * 1000).await;
|
||||
// 二次检查:sleep 期间用户可能切回手动。
|
||||
if refresh_interval().is_none() {
|
||||
continue;
|
||||
@ -514,10 +496,10 @@ fn ServerStatusTab() -> Element {
|
||||
loop {
|
||||
let ms = refresh_ms().unwrap_or(0);
|
||||
if ms == 0 {
|
||||
wasm_sleep(200).await;
|
||||
crate::utils::time::sleep_ms(200).await;
|
||||
continue;
|
||||
}
|
||||
wasm_sleep(ms).await;
|
||||
crate::utils::time::sleep_ms(ms).await;
|
||||
if refresh_ms().is_none() {
|
||||
continue;
|
||||
}
|
||||
@ -1270,13 +1252,13 @@ fn BackupTab() -> Element {
|
||||
Some(t) => t,
|
||||
None => {
|
||||
// 空闲:短 yield,最多 200ms 后响应新任务。
|
||||
wasm_sleep(200).await;
|
||||
crate::utils::time::sleep_ms(200).await;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
// 有任务在途:进入 1.5s 轮询,直到 Done/Failed/出错。
|
||||
loop {
|
||||
wasm_sleep(1500).await;
|
||||
crate::utils::time::sleep_ms(1500).await;
|
||||
match get_task_progress(tid.clone()).await {
|
||||
Ok(p) => {
|
||||
let done = p.status == TaskStatus::Done
|
||||
|
||||
@ -11,8 +11,8 @@ use chrono::DateTime;
|
||||
|
||||
/// 异步睡眠指定毫秒数。
|
||||
///
|
||||
/// 用 `js_sys::Promise` + `web_sys::Window::set_timeout_*` 构造,与
|
||||
/// `pages/admin/system.rs::wasm_sleep` 同款写法,避免 `js_sys::eval` 字符串求值。
|
||||
/// WASM 端用 `js_sys::Promise` + `web_sys::Window::set_timeout_*` 构造,
|
||||
/// 避免 `js_sys::eval` 字符串求值。全项目统一的 sleep 入口。
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub async fn sleep_ms(ms: u32) {
|
||||
use wasm_bindgen::JsCast;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user