解决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 相关文章推荐
js 本地预览的简单实现方法
Feb 18 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
关于jQuery库冲突的完美解决办法
May 20 jQuery
ReactNative页面跳转Navigator实现的示例代码
Aug 02 Javascript
基于Vue实现支持按周切换的日历
Sep 24 Javascript
在 React、Vue项目中使用SVG的方法
Feb 09 Javascript
浅析node.js的模块加载机制
May 25 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
Sep 18 Javascript
Vue起步(无cli)的啊教程详解
Apr 11 Javascript
vue实现点击按钮下载文件功能
Oct 11 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
PHP5函数小全(分享)
2013/06/06 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
请离开include_once和require_once
2013/07/18 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
初步讲解Python中的元组概念
2015/05/21 Python
Python 实现简单的电话本功能
2015/08/09 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
python 初始化一个定长的数组实例
2019/12/02 Python
python 日志 logging模块详细解析
2020/03/31 Python
django实现后台显示媒体文件
2020/04/07 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
个人教师自我评价范文
2013/12/02 职场文书
个人求职信范文分享
2014/01/06 职场文书
军训自我鉴定200字
2014/02/13 职场文书
公司财务部岗位职责
2015/04/14 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server