解决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 类方法定义还是有点区别
Apr 15 Javascript
一个JQuery操作Table的代码分享
Mar 30 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 Javascript
javascript制作2048游戏
Mar 30 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
May 31 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
seajs学习教程之基础篇
Oct 20 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
axios实现简单文件上传功能
Sep 25 Javascript
JavaScript常用工具函数汇总(浏览器环境)
Sep 17 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
Nov 03 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文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
PHP实现简易计算器功能
2020/08/28 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
详解redux异步操作实践
2018/08/15 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python实现在windows下操作word的方法
2015/04/28 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
python批量生成条形码的示例
2020/10/10 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
名人演讲稿范文
2013/12/28 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
2015年见习期工作总结
2014/12/12 职场文书
结婚幸福感言
2015/08/01 职场文书