使用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 charAt的使用示例
Feb 18 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
巧用jQuery选择器提高写表单效率的方法
Aug 19 Javascript
headjs实现网站并行加载但顺序执行JS
Nov 29 Javascript
Vue数据驱动模拟实现3
Jan 11 Javascript
js中的面向对象入门
Mar 06 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 Javascript
angular内置provider之$compileProvider详解
Sep 27 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
JavaScript使用闭包模仿块级作用域操作示例
Jan 21 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
园林资料员岗位职责
2013/12/30 职场文书
消防安全管理制度
2014/02/01 职场文书
小学数学教研活动总结
2014/07/01 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python