UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

75 lines (74 loc) 2.44 kB
import { createUrlQueryString, isUrl } from "../utils/index.js"; import { ensureInMiniProgram } from "./ensureInMiniProgram.js"; import { getMiniProgramConfig } from "./miniProgramConfig.js"; import { miniProgramBus } from "./miniProgramBus.js"; /** * 跳转至某个页面,跳转失败时会尝试切换到 Tab 页。 * * **注意:在页面真正切换后 Promise 才会被 resolve,因而此时的页面上下文已经是新页面。** * * @param url 要跳转去的页面地址 * @param query 查询参数 * @param redirect 是否关闭当前页面后跳转 */ export function navigatePageTo(url, query, redirect) { var routeChanged; var routeChangeResolve; var offRouteChange = miniProgramBus.once('routeChange', function () { if (routeChangeResolve) { routeChangeResolve(); } else { routeChanged = true; } }); return new Promise(function (resolve, reject) { ensureInMiniProgram(function (mp) { if (isUrl(url)) { var _getMiniProgramConfig = getMiniProgramConfig(), webUrlToMiniProgramUrl = _getMiniProgramConfig.webUrlToMiniProgramUrl; if (typeof webUrlToMiniProgramUrl === 'function') { url = webUrlToMiniProgramUrl(url); } } if (query && typeof query === 'object') { var queryString = createUrlQueryString(query); if (queryString) { url += (url.indexOf('?') > -1 ? '&' : '?') + queryString; } } var switchTab = function switchTab() { return new Promise(function (resolve, reject) { mp.switchTab({ url: url, success: resolve, fail: reject }); }); }; var navigateTo = function navigateTo() { return new Promise(function (resolve, reject) { ; (redirect ? mp.redirectTo : mp.navigateTo)({ url: url, success: resolve, fail: reject }); }); }; // 支付宝下 navigateTo、redirectTo 也能跳转到 Tab 页并不会报错,只是不会显示 Tab 栏 if (mp.$brand === '支付宝') { return switchTab().catch(navigateTo); } return navigateTo().catch(switchTab); }).then(function () { if (routeChanged) { resolve(); } else { routeChangeResolve = resolve; } }).catch(function () { offRouteChange(); reject(); }); }); }