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:
xfy 2026-07-14 14:55:34 +08:00
parent 804bcfb7b7
commit 9e57247a2d
3 changed files with 9 additions and 33 deletions

View File

@ -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() {

View File

@ -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

View File

@ -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;