Procházet zdrojové kódy

[Fix R3-8] 恢复 resetMicroContentWH 的 onTimeout 形参(修 4 调用方失配致遮罩永久卡死)

lizuo před 1 dnem
rodič
revize
ce74a28855
1 změnil soubory, kde provedl 11 přidání a 1 odebrání
  1. 11 1
      src/utils/domUtils.ts

+ 11 - 1
src/utils/domUtils.ts

@@ -171,7 +171,16 @@ export function useRafThrottle<T extends FunctionArgs>(fn: T): T {
   };
 }
 
-export function resetMicroContentWH(domId, callBack?: Function, maxWaitMs = 60000) {
+export function resetMicroContentWH(domId, callBack?: Function, onTimeout?: Function, maxWaitMs = 60000) {
+  // [审计-第三轮 R3-8] 恢复 2eb75d33 语义 + 加类型防御
+  // 原行为(团队 7e9858ec 回滚后):签名变成 (domId, callBack?, maxWaitMs=60000),
+  //   但 4 个调用方(needAir/ventDoc/ventModal/ventModal2D.vue)仍按旧签名传 3 个参数,
+  //   错误态回调(onTimeout)被塞进 maxWaitMs,number 与 function 比较恒 false →
+  //   60s 超时兜底永不触发:子应用加载失败时遮罩永久转圈、loadFailed 永不置位、每秒轮询不停。
+  // 现行为:签名恢复为 (domId, callBack?, onTimeout?, maxWaitMs=60000),超时分支里先调 onTimeout() 再调 callBack(),
+  //   并加防御——maxWaitMs 不是数字时回退 60000,防止将来再出现"回调被塞进数值参数"这类失配。
+  // 原实现见 2eb75d33 [Fix SEC-20260913] 子应用加载超时错误态与重试入口。
+  if (typeof maxWaitMs !== 'number') maxWaitMs = 60000;
   // [fix-subapp-loading] 增加超时兜底:原实现每秒无限轮询等待微应用容器出现内容,
   // 微应用挂载失败/被卸载时容器永远为空 → 加载遮罩永久转圈(整页"正在加载"卡死,见 docs/17 §8)。
   // 超时后强制放行(隐藏遮罩),把"整页永久卡死"降级为"页面可见但内容可能缺失"。
@@ -188,6 +197,7 @@ export function resetMicroContentWH(domId, callBack?: Function, maxWaitMs = 6000
     } else if (Date.now() - start >= maxWaitMs) {
       done = true;
       console.error('[fix-subapp-loading] 微应用容器等待超时,强制放行:', domId);
+      if (onTimeout) onTimeout();
       if (callBack) callBack();
     } else {
       setTimeout(poll, 1000);