// HR 模块路由工具:统一处理 reLaunch 去重与返回兜底 // 规范化页面路径:去掉 query / hash 与开头斜杠,得到与 getCurrentPages().route 一致的格式 function normalizeRoute(url) { return url.split("?")[0].split("#")[0].replace(/^\//, ""); } // 记录最近一次 reLaunch,用于去重:避免连续两次相同导航互相取消 let lastRelaunch = null; /** * 带防护的 reLaunch: * - 目标就是当前页时直接跳过(reLaunch 会销毁重建当前页,导致 onLoad 与页面请求重复执行); * - 同目标的并发导航复用上一次结果,不再发起新 reLaunch; * - 即便被新导航取消(Navigation cancelled),也吞掉 rejection,不抛未处理异常。 */ export function switchMain(url) { const target = normalizeRoute(url); const pages = getCurrentPages() || []; if (pages.length && pages[pages.length - 1] && pages[pages.length - 1].route === target) { return Promise.resolve(); } if (lastRelaunch && lastRelaunch.target === target) return lastRelaunch.promise; const promise = new Promise((resolve) => { uni.reLaunch({ url, success: () => resolve(), fail: (err) => { if (!err || /Navigation cancelled/i.test(String(err.errMsg || ""))) { resolve(); } else { console.error("[hr-router] reLaunch failed:", err); resolve(); } }, }); }); lastRelaunch = { target, promise }; promise.finally(() => { if (lastRelaunch && lastRelaunch.promise === promise) lastRelaunch = null; }); return promise; } export function go(url) { uni.navigateTo({ url }); } // 返回上一页;没有上一页(深链进入)时退回 fallbackUrl export function back(fallbackUrl = "") { const pages = getCurrentPages() || []; if (pages.length > 1) { uni.navigateBack({ delta: 1 }); return; } if (fallbackUrl) switchMain(fallbackUrl); }