promise对象与promise在vue axios响应拦截器中的应用

目录

一.深入理解promise

二、promise在vue响应拦截器的实际应用


console.log('start')
setTimeout(()=>{console.log('请求后端数据(约3秒)')}, 3000); 
console.log('end')

代码分析1
js异步执行,不阻塞,但有些操作之后需要执行回调。下例可以简单实现回调,但这种回调是定时回调,如下请求后端数据,给定3s,如3s后端还没返回,这时执行回调得不到数据,或后端1s就已返回,前端却固定3s才能执行回调,作了无畏的等待。显然都是不合适的。

类比后端的ScheduledThreadPoolExecutor,ThreadPoolTaskScheduler理解

前者是jdk的带任务调度功能的线程池,可以定时执行任务,类似setTime,后者是spring对jdk增强,实现了可监听的任务调度,可以在异步任务执行完返回时即时被监听到,从而执行后续任务。参考:https://blog.csdn.net/qq_39506978/article/details/109879847

promise实例1理解
Promise和spring实现的ThreadPoolTaskScheduler比较类似,它不需要通过setTime这种不可靠的方式执行回调,而是等传入promise对象的函数有了返回值就即时执行下一步。这类似一种承诺,保证传入promise的函数执行完成就立即执行后续.如下例

new Promise((resolve, reject) => {
    if (1 == 1) {
        resolve('异步任务返回成功')
    } else {
        reject('异步任务返回失败')
    }
}).then(res => {

    console.log(res)
    console.log("成功后的下一步")
}).catch(err => {

    console.log(err)
    console.log('错误后的下一步')
})

 

resolve及reject函数的入参及下一步then/error的入参

promise实例2理解

new Promise((resolve,reject)=>{throw new Error('手动抛的异常')}).then(res=>{console.log('成功')})

new Promise((resolve,reject)=>{reject('手动抛的异常')}).then(res=>{console.log('成功')})

这里异步函数手动抛了一个异常,但是后续没对异常处理,浏览器直接打印了uncaught异常及异常信息

二、promise在vue响应拦截器的实际应用

http.interceptors.response.use(response=> {
//后端返回特殊状态码2,弹框MessageBox(elementsUI的组件)
  if (response.data.code == '2') {
      MessageBox.confirm('登录已失效,请重新登录', '确认登出?', {
        confirmButtonText: '重新登录',
        type: 'warning',
        showCancelButton: false,
        showClose: false
      }).then(() => {
        store.commit('refreshTokenTimeOutNum');
        router.replace({
          path: '/',
        })
      })
  }
  //后端通用异常码,直接显示异常信息
  if (response.data.code == '1') {
    Message({
      showClose: true,
      message: response.data.message,
      type: 'error',
      duration: 2000
    })
  }
  //后端返回未处理的异常码
  if (response.data.code == '9999') {
    Message({
      showClose: true,
      message: response.data.message,
      type: 'error',
      duration: 2000
    })
  }
//其它情况直接返回
  return response;
},
//后端请求异常,非httpStatus Code!=200时,这里一般丢锅给网络
error=> {
   Message.error('网络异常');
});

可以看到第一个参数为promise对象。

拦截器返回的promise对象——response,非httpStatus Code!=200时如网络异常等直接弹框显示等,故请求后端接口时不需要再对异常情况进行后续catch处理了

this.$http.get("/xx/entp/123").then((res) => {console.log(res.data)} .catch(err=>{console.log('我是多余滴catch')})

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,在响应拦截器跳转路由可以通过使用Vue Router实现。要在响应拦截器跳转路由,首先需要在项目引入Vue Router,并在main.js或者需要使用路由的文件进行配置。 首先,需要在项目安装Vue Router,可以使用npm或者yarn进行安装。然后,在main.js文件引入Vue Router并配置: ```javascript import Vue from 'vue' import VueRouter from 'vue-router' import App from './App.vue' Vue.use(VueRouter) const router = new VueRouter({ routes: [ // 定义路由信息 { path: '/home', component: Home }, { path: '/about', component: About }, // ... ] }) new Vue({ router, render: h => h(App) }).$mount('#app') ``` 然后,在需要使用响应拦截器的地方进行配置: ```javascript import axios from 'axios' import router from './router' axios.interceptors.response.use(response => { // 在响应拦截器对返回的响应进行逻辑处理 if (response.status === 200) { // 根据逻辑判断,如果需要跳转路由,可以使用router.push方法实现跳转 router.push('/home') // 这里是示例,跳转到名为home的路由 } return response }, error => { return Promise.reject(error) }) ``` 在上述代码,我们使用router.push方法在响应拦截器跳转到指定的路由。通过在Vue Router定义路由规则,我们指定了需要跳转的目标路由。当满足某个条件时,我们调用router.push方法进行路由跳转。 需要注意的是,我们需要确保在使用router实例之前Vue Router已经完成了初始化和配置。在main.js文件,我们在创建Vue实例之前初始化并传入了router实例。 这样,在响应拦截器调用router.push方法就可以实现路由的跳转了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值