使用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 相关文章推荐
javascript实现划词标记+划词搜索功能
Mar 06 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
May 26 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
May 20 Javascript
Windows8下搭建Node.js开发环境教程
Sep 03 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
Aug 18 Javascript
全面解析vue中的数据双向绑定
May 10 Javascript
JavaScript闭包和回调详解
Aug 09 Javascript
浅谈vue-cli 3.0.x 初体验
Apr 11 Javascript
Vue多组件仓库开发与发布详解
Feb 28 Javascript
解决layui弹框失效的问题
Sep 09 Javascript
js实现转动骰子模型
Oct 24 Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 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备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php实现图片添加水印功能
2014/02/13 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
Javascript如何实现扩充基本类型
2020/08/26 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
详解在Python程序中解析并修改XML内容的方法
2015/11/16 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
经济管理毕业生求职信
2014/03/15 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
企业安全标语
2014/06/07 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
2016情人节宣传语
2015/07/14 职场文书