使用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 相关文章推荐
用正则xmlHttp实现的偷(转)
Jan 22 Javascript
JavaScript 比较时间大小的代码
Apr 24 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
Jan 09 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
jquery利用json实现页面之间传值的实例解析
Dec 12 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
Dec 17 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
Jan 20 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
Jul 05 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
js面向对象之实现淘宝放大镜
Jan 15 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
拼音码表的生成
2006/10/09 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
基于jquery的时间段实现代码
2012/08/02 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
2017/03/08 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
JS实现li标签的删除
2019/04/12 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
python中stdout输出不缓存的设置方法
2014/05/29 Python
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
Python实现的一个简单LRU cache
2014/09/26 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
四风批评与自我批评发言稿
2014/10/14 职场文书
银行求职信范文
2019/05/13 职场文书