解决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 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
JQuery与JS里submit()的区别示例介绍
Feb 17 Javascript
jquery操作angularjs对象
Jun 26 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
Dec 31 Javascript
jQuery购物网页经典制作案例
Aug 19 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
Vue学习笔记之表单输入控件绑定
Sep 05 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 Javascript
JavaScript交换两个变量方法实例
Nov 25 Javascript
详解VUE中的插值( Interpolation)语法
Oct 18 Javascript
JavaScript动态生成表格的示例
Nov 02 Javascript
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
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
php面向对象值单例模式
2016/05/03 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python chardet库识别编码原理解析
2020/02/18 Python
Python对wav文件的重采样实例
2020/02/25 Python
python statsmodel的使用
2020/12/21 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
实习教师自我鉴定
2013/12/12 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
好的促销活动方案
2014/08/21 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
《藏戏》教学反思
2016/02/23 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android