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;
|
use wasm_bindgen::JsCast;
|
||||||
|
|
||||||
// 等待 DOM 节点更新
|
// 等待 DOM 节点更新
|
||||||
let promise = js_sys::Promise::new(&mut |resolve, _| {
|
crate::utils::time::sleep_ms(50).await;
|
||||||
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;
|
|
||||||
|
|
||||||
if let Some(window) = web_sys::window() {
|
if let Some(window) = web_sys::window() {
|
||||||
if let Some(doc) = window.document() {
|
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 + 活跃连接。
|
/// 数据库状态 tab:概览卡片 + 表清单 + 索引 Top + 活跃连接。
|
||||||
/// 手动刷新按钮 + 自动刷新开关(1s/2s/5s/30s/手动,默认手动)。
|
/// 手动刷新按钮 + 自动刷新开关(1s/2s/5s/30s/手动,默认手动)。
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
@ -204,10 +186,10 @@ fn DbStatusTab() -> Element {
|
|||||||
if secs == 0 {
|
if secs == 0 {
|
||||||
// 手动模式:短暂 yield,让事件循环呼吸,避免忙等;
|
// 手动模式:短暂 yield,让事件循环呼吸,避免忙等;
|
||||||
// 用户切换到自动模式后最多等 200ms 即响应。
|
// 用户切换到自动模式后最多等 200ms 即响应。
|
||||||
wasm_sleep(200).await;
|
crate::utils::time::sleep_ms(200).await;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
wasm_sleep(secs * 1000).await;
|
crate::utils::time::sleep_ms(secs * 1000).await;
|
||||||
// 二次检查:sleep 期间用户可能切回手动。
|
// 二次检查:sleep 期间用户可能切回手动。
|
||||||
if refresh_interval().is_none() {
|
if refresh_interval().is_none() {
|
||||||
continue;
|
continue;
|
||||||
@ -514,10 +496,10 @@ fn ServerStatusTab() -> Element {
|
|||||||
loop {
|
loop {
|
||||||
let ms = refresh_ms().unwrap_or(0);
|
let ms = refresh_ms().unwrap_or(0);
|
||||||
if ms == 0 {
|
if ms == 0 {
|
||||||
wasm_sleep(200).await;
|
crate::utils::time::sleep_ms(200).await;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
wasm_sleep(ms).await;
|
crate::utils::time::sleep_ms(ms).await;
|
||||||
if refresh_ms().is_none() {
|
if refresh_ms().is_none() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1270,13 +1252,13 @@ fn BackupTab() -> Element {
|
|||||||
Some(t) => t,
|
Some(t) => t,
|
||||||
None => {
|
None => {
|
||||||
// 空闲:短 yield,最多 200ms 后响应新任务。
|
// 空闲:短 yield,最多 200ms 后响应新任务。
|
||||||
wasm_sleep(200).await;
|
crate::utils::time::sleep_ms(200).await;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// 有任务在途:进入 1.5s 轮询,直到 Done/Failed/出错。
|
// 有任务在途:进入 1.5s 轮询,直到 Done/Failed/出错。
|
||||||
loop {
|
loop {
|
||||||
wasm_sleep(1500).await;
|
crate::utils::time::sleep_ms(1500).await;
|
||||||
match get_task_progress(tid.clone()).await {
|
match get_task_progress(tid.clone()).await {
|
||||||
Ok(p) => {
|
Ok(p) => {
|
||||||
let done = p.status == TaskStatus::Done
|
let done = p.status == TaskStatus::Done
|
||||||
|
|||||||
@ -11,8 +11,8 @@ use chrono::DateTime;
|
|||||||
|
|
||||||
/// 异步睡眠指定毫秒数。
|
/// 异步睡眠指定毫秒数。
|
||||||
///
|
///
|
||||||
/// 用 `js_sys::Promise` + `web_sys::Window::set_timeout_*` 构造,与
|
/// WASM 端用 `js_sys::Promise` + `web_sys::Window::set_timeout_*` 构造,
|
||||||
/// `pages/admin/system.rs::wasm_sleep` 同款写法,避免 `js_sys::eval` 字符串求值。
|
/// 避免 `js_sys::eval` 字符串求值。全项目统一的 sleep 入口。
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
pub async fn sleep_ms(ms: u32) {
|
pub async fn sleep_ms(ms: u32) {
|
||||||
use wasm_bindgen::JsCast;
|
use wasm_bindgen::JsCast;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user