uni-app跳转报错:跳转失败,动作被拦截,因为已经有一个正在执行的路由动作

发布于 1周前 作者 wuwangju 来自 Uni-App

uni-app跳转报错:跳转失败,动作被拦截,因为已经有一个正在执行的路由动作

问题描述

用uniapp开发web端,使用页面跳转api(比如uni.navigateTo,relaunch等等),只有第一次能调用成功,第二次之后都报错:跳转失败:动作被拦截,因为已经有一个正在执行的路由动作

2 回复

那肯定的啊 你要是做拦截后重定向,只能写一处 , 你要写多处 ,程序也不知道你要跳哪里


在处理uni-app中的路由跳转错误时,特别是遇到“跳转失败,动作被拦截,因为已经有一个正在执行的路由动作”这类错误,通常是因为在较短时间内触发了多次路由跳转,而前一个跳转动作尚未完成。为了避免这种情况,你可以采取以下几种策略:

  1. 使用全局变量进行跳转控制: 设置一个全局变量来标记当前是否正在进行路由跳转,如果正在跳转,则阻止后续的跳转请求。

    // 在 main.js 或其他全局文件中定义
    let isNavigating = false;
    
    Vue.prototype.$navigateTo = function(url) {
        if (!isNavigating) {
            isNavigating = true;
            uni.navigateTo({
                url: url,
                success: function() {
                    isNavigating = false;
                },
                fail: function() {
                    isNavigating = false;
                }
            });
        } else {
            console.warn('A navigation action is already in progress.');
        }
    };
    
    // 在组件中使用
    this.$navigateTo('/pages/targetPage/targetPage');
    
  2. 使用Promise或async/await进行串行处理: 如果你需要在多个条件下触发跳转,确保这些跳转是串行执行的。

    async function navigateAfterCondition() {
        try {
            await new Promise((resolve) => {
                setTimeout(resolve, 1000); // 模拟等待条件满足
            });
            await uni.navigateTo({
                url: '/pages/targetPage/targetPage'
            });
        } catch (error) {
            console.error('Navigation failed:', error);
        }
    }
    
    // 调用函数
    navigateAfterCondition();
    
  3. 检查并取消未完成的路由请求: 在某些情况下,你可能需要取消未完成的路由请求,尤其是在处理复杂的用户交互时。

    let navigationTask;
    
    function navigateWithCancellation(url) {
        if (navigationTask) {
            navigationTask.cancel(); // 假设你有一个取消方法
        }
        navigationTask = uni.navigateTo({
            url: url,
            success: function() {
                navigationTask = null;
            },
            fail: function(err) {
                navigationTask = null;
                console.error('Navigation failed:', err);
            }
        });
    }
    
    // 注意:uni.navigateTo 不原生支持取消,这里仅为示意,实际需自行实现逻辑
    

通过上述方法,你可以有效地管理uni-app中的路由跳转,避免因为并发跳转导致的错误。在实际开发中,根据具体需求选择合适的方法,并确保代码的可读性和可维护性。

回到顶部