使用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 相关文章推荐
zeroclipboard复制到剪切板的flash
Aug 04 Javascript
namespace.js Javascript的命名空间库
Oct 11 Javascript
JavaScript内核之基本概念
Oct 21 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
Mar 02 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
Mar 07 Javascript
JS控制TreeView的结点选择
Nov 11 Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
微信小程序后端无法保持session的原因及解决办法问题
Mar 20 Javascript
Python版实现微信公众号扫码登陆
May 28 Javascript
原生JS实现记忆翻牌游戏
Jul 31 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
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+APACHE实现用户论证的方法
2006/10/09 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现获取序列中最小的几个元素
2014/09/25 Python
python实现识别相似图片小结
2016/02/22 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python 线程池用法简单示例
2019/10/02 Python
python根据文本生成词云图代码实例
2019/11/15 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
酒店前台接待岗位职责
2013/12/03 职场文书
个人贷款承诺书
2014/03/28 职场文书
项目经理任命书
2014/06/04 职场文书
霸气押韵的班级口号
2014/06/09 职场文书
企业读书活动总结
2014/06/30 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技