解决Vue-Router升级导致的Uncaught (in promise)问题


Posted in Javascript onAugust 07, 2020

在升级了Vue-Router版本到到3.1.0及以上之后,页面在跳转路由控制台会报Uncaught (in promise)的问题

解决Vue-Router升级导致的Uncaught (in promise)问题

这是什么原因呢?

看vue-router的版本更新日志

V3.1.0版本里面新增功能:push和replace方法会返回一个promise, 你可能在控制台看到未捕获的异常

解决Vue-Router升级导致的Uncaught (in promise)问题

解决方法一:在调用方法的时候用catch捕获异常

this.$router.replace({ name: 'foo' }).catch(err => {
 console.log('all good')
})

方法二: 对Router原型链上的push、replace方法进行重写,这样就不用每次调用方法都要加上catch。这个方法是vue-router的issues里面的一位大佬解决的

import Router from 'vue-router'
 
const originalPush = Router.prototype.push
Router.prototype.push = function push(location, onResolve, onReject) {
 if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
 return originalPush.call(this, location).catch(err => err)
}

补充知识:vue-router使用$router.push(),页面挂起进入debug模式,提示Uncaught (in promise) undefined

问题

vue-router使用$router.push()跳转页面时,页面挂起进入debug模式,提示“Uncaught (in promise) undefined”,断点进入

function (err) {
   if (onAbort) {
    onAbort(err);
   }
   ……
}

此方法

解决Vue-Router升级导致的Uncaught (in promise)问题

分析()

Uncaught (in promise) undefined,未捕获的promise,因为应用程序实际上没有生成任何错误。它只是一个导航($router.push),在beforeEnter钩子中生成重定向(next('/ foo'))

Vue-router >= 3.1.0 版本在使用 push 和 replace 进行跳转时控制台会抛出异常,其主要原因是 vue-router 3.1.0 版本以后 router.push('/path') 返回了 promise ,而当路由跳转异常时便会抛出错误,此前版本没有报错是因为 vue-router 根本没有返回错误信息,所以之前我们一直无法捕获异常,而并非异常不存在。所以我们要做的就是在路由跑出异常时加上可以接收的回调就好了。

解决

1.使用route-link to bar代替$push

<router-link to="/settlement_manage/account">
    <el-button :disabled="loading" size="mini" type="warning">
      查看详情
    </el-button>
  </router-link>

2.对所有调用进行push更新:

this.$router.push({
    path: '/settlement_manage/account',
  }, () => {});

3.使用时进行错误拦截

router.push('/path').catch(err => {})

4.显式指定onComplete和onAbort回调函数

this.$router.push({
    path: `/settlement_manage/account`
   },
   onComplete => {
    console.log('完成')
   },
   onAbort => {
    console.log('哦打断了')
   })

5.引入router之前重写push方法,在router.js里加

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location, onResolve, onReject) {
 if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
 return originalPush.call(this, location).catch(err => err)
}

解决Vue-Router升级导致的Uncaught (in promise)问题

ok!以上所有方法亲测有效~

以上这篇解决Vue-Router升级导致的Uncaught (in promise)问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
form表单action提交的js部分与html部分
Jan 07 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
Oct 23 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
微信小程序自定义导航隐藏和显示功能
Jun 13 Javascript
微信小程序 检查接口状态实例详解
Jun 23 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 Javascript
JS实现移动端点击按钮复制文本内容
Jul 28 Javascript
vue如何搭建多页面多系统应用
Jun 17 Javascript
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
JavaScript实现多文件下载方法解析
Aug 07 #Javascript
基于javascript的无缝滚动动画1
Aug 07 #Javascript
vue-router重写push方法,解决相同路径跳转报错问题
Aug 07 #Javascript
手把手带你搭建一个node cli的方法示例
Aug 07 #Javascript
Vue两种组件类型:递归组件和动态组件的用法
Aug 06 #Javascript
vue数据更新UI不刷新显示的解决办法
Aug 06 #Javascript
基于vue 动态菜单 刷新空白问题的解决
Aug 06 #Javascript
You might like
Banner程序
2006/10/09 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python中的random()方法的使用介绍
2015/05/15 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
Python 使用type来定义类的实现
2019/11/19 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
数据库方面面试题
2012/04/22 面试题
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
退休感言
2014/01/28 职场文书
岗位竞聘书范文
2014/03/31 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
公司委托书格式范文
2014/10/09 职场文书
环境卫生整治简报
2015/07/20 职场文书