| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // 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);
- }
|