使用async await 封装 axios的方法


Posted in Javascript onJuly 09, 2018

es6 的promise 逐步解决了层层回调的问题,es8的async await让异步变成了同步的写法,在vue中,可以通过封装axios,使得所有的请求都可以使用同步写法,同时处理错误信息等,可以建一个api.js文件,全局创建api实例.

import axios from 'axios'
const qs = require('qs')
const api = {
 async get (url, data) {
  try {
   let res = await axios.get(url, {params: data})
   res = res.data
   return new Promise((resolve) => {
    if (res.code === 0) {
     resolve(res)
    } else {
     resolve(res)
    }
   })
  } catch (err) {
   alert('服务器出错')
   console.log(err)
  }
 },
 async post (url, data) {
  try {
   let res = await axios.post(url, qs.stringify(data))
   res = res.data
   return new Promise((resolve, reject) => {
    if (res.code === 0) {
     resolve(res)
    } else {
     reject(res)
    }
   })
  } catch (err) {
   // return (e.message)
   alert('服务器出错')
   console.log(err)
  }
 },
}
export { api }

上述代码中,首先采用try,catch 捕获请求的错误, 如果网络状态差,服务器错误等 ,然后在请求成功状态中,亦可统一处理请求代码,这个可以根据具体项目处理,上例表示code=0的时候为结果正确状态.

使用可以参考如下,以vue项目为例:

import { api } from 'common/js/api'

export default {
 data () {
  return {
   list: [],
  }
 },
 created () {
  this.getList()
 },
 methods: {
  async getList () {
   let {data} = await api.get('/ferring/test/list')
   console.log(data)
   this.list = data
  }
 },
}

有时候我们可能想比如错误处理能通过vue的一些组件比如toast这样的弹出,但是这个api.js不是在项目中,那该如何用呢, 下面以vue项目为例简述:

有些ui库,比如element ui这种,已经将toast这种做成了插件,可以直接用this示例打开弹窗

<template>
 <el-button type="text" @click="open">点击打开 Message Box</el-button>
</template>

<script>
 export default {
  methods: {
   open() {
    this.$alert('这是一段内容', '标题名称', {
     confirmButtonText: '确定',
     callback: action => {
      this.$message({
       type: 'info',
       message: `action: ${ action }`
      });
     }
    });
   }
  }
 }
</script>

以上代码摘自element Ui ,如果想全局处理,在api.js中,如何获取vue的this示例呢,在main.js里面,可以将vue实例挂载在window对象上

/* eslint-disable no-new */
window.wm = new Vue({
 el: '#app',
 router,
 render: h => h(App),
})

那么回到刚刚的api.js ,则可以直接在resolve 或者catch的情况下,调用 window.wm.$alert,这样就可以借用vue的插件形式调用弹窗组件了.

如果没有这种用this调用的 弹窗组件,我们也可以写一个放在app.vue下, 然后通过vuex全局控制,

那么可以在api.js中引入store

import store from '../store'

在catch 或者 resolve条件下

store.commit('showDialog',{true,'请求出错'})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
Js点击弹出下拉菜单效果实例
Aug 12 Javascript
express的中间件bodyParser详解
Dec 04 Javascript
JavaScript实现获取dom中class的方法
Feb 09 Javascript
javascript制作照片墙及制作过程中出现的问题
Apr 04 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
Jul 09 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
Aug 19 Javascript
Bootstrap字体图标无法正常显示的解决方法
Oct 08 Javascript
js 提取某()特殊字符串长度的实例
Dec 06 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
js实现图片实时时钟
Jan 15 Javascript
解决vue路由name同名,路由重复的问题
Aug 05 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 #Javascript
jQuery实现简单复制json对象和json对象集合操作示例
Jul 09 #jQuery
JS实现图片旋转动画效果封装与使用示例
Jul 09 #Javascript
JavaScript的Object.defineProperty详解
Jul 09 #Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
Jul 08 #Javascript
mac上配置Android环境变量的方法
Jul 08 #Javascript
vue.js使用watch监听路由变化的方法
Jul 08 #Javascript
You might like
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
python解析xml文件实例分享
2013/12/04 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
研发工程师岗位职责
2014/04/28 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
教师见习报告范文
2014/11/03 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
庆七一主持词
2015/06/29 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
我的收音机情缘
2022/04/05 无线电
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL