优化trycatch(完结)

前言:阅读这篇文章前建议先看一下前置知识点 指路:优化trycatch所需的前置知识点_多多的小宝贝的博客-CSDN博客

啦啦啦~通过前面的知识我们已经知道:promise对象的then方法中虽然不能直接获取到请求失败的结果,但是我们可以借助一个新的Promise对象来中转一下,这样就可以在Promise对象的then方法中取到请求失败的结果啦~

实现思路:利用promise对象A then方法返回的那个全新Promise对象B(全新:意思就是他就是他,和别的Promise对象不一样,是独立存在的)来中转,用这个全新Promise对象B的then,catch方法来收集成功失败的结果,并且在then catch 方法中return 成功/失败的结果,这样一来,这个return 出来的结果就会被这个then返回的全新Promise对象C 的then收集啦~这里不好理解,要静下心好好琢磨!加油~~

下面就开始优化trycatch啦~~

一、看看优化的代码的样子

1.1.调接口发请求

async clickFn(){
    try {
        //调用接口
        const res = await loginAPI(this.loginForm) //this.loginForm是接口参数,可忽略
        console.log(res)
        alert(res.message)
     }catch (error) { 
        alert(error.message)
        }
   }

1.2.接口的封装代码

export const loginAPI = (data) => {
  return request({
    url: '/sys/login',
    method: 'POST',
    data
  })
}

2.利用promise对象实现优化

2.1封装优化的工具函数

//按需带出封装的函数方法
export const to = (promiseA) => {
  // 传入原来Promise对象, 我这里负责成功/失败结果的接收
  const PromiseB = promiseA.then(res => {
    return [null, res]
  }).catch(err => {
    return [err, null]
  })
   //这里用来统一接处理成功/失败结果
  return PromiseB
}
// axios内响应拦截器用success判断
// 返回成功就进上面的then, 返回失败进catch
// 原来是直接返回到逻辑页面, 而这里被to包进来
// 先走这里中转一下, 在return一个数组给逻辑页面

2.2更改接口文件

import request from '这里是我的axios请求文件路径'
export function loginAPI(data) {
  const axiosPromiseA = request({
    url: '/sys/login',
    method: 'POST',
    data
  })
  return to(axiosPromiseA) // 被中间的Promise过程处理,返回promiseB
}

2.3逻辑页面调用接口

async clickFn(){
    const [err, res] = await loginAPI(this.loginForm)
        if (!err) {
            console.log(res) //打印成功结果
            alert(res.message)
        } else{
            console.error(err) //打印错误信息
             alert(err)
        }
          
  }

2.4 axios请求文件代码

import axios from 'axios'
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, //配置基地址
  timeout: 5000 // request timeout
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // do something before request is sent
    return config
  },
  error => {
    // do something with request error
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(// 对响应做些什么(但是什么都不写默认)
  response => { // 默认2xx, 3xx开头的http响应状态码进入这里-返回成功
    console.log(response)
    // 利用解构赋值写法
    const { success, message } = response.data// 把后台返回的数据对象, 解构赋值
    if (success) { // 解构赋值写法
      return response.data // 直接把后台返回的数据对象返回到axios请求的地方
    } else {
      // 返回Promise失败对象(内部错误提示文字)
      return Promise.reject(message)// 解构赋值写法
    }
  },
  error => { // 默认4xx, 5xx开头的http响应状态码进入这里-返回失败(await不放行)
    return Promise.reject(error)
  }
)

export default service

猜你喜欢

转载自blog.csdn.net/weixin_45371730/article/details/122032691