使用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 17 Javascript
如何正确使用javascript 来进行我们的程序开发
Jun 23 Javascript
Extjs grid panel自带滚动条失效的解决方法
Sep 11 Javascript
JS检测移动端横竖屏的代码
May 30 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
Oct 25 Javascript
Vue.js计算属性computed与watch(5)
Dec 09 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
ajax与json 获取数据并在前台使用简单实例
Jan 19 Javascript
node中koa中间件机制详解
Aug 22 Javascript
EasyUI实现下拉框多选功能
Nov 07 Javascript
MVVM 双向绑定的实现代码
Jun 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概述.
2006/10/09 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP中文乱码解决方案
2015/03/05 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python 登录网站详解及实例
2017/04/11 Python
python3 enum模块的应用实例详解
2019/08/12 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
python输出pdf文档的实例
2020/02/13 Python
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
abstract是什么意思
2012/02/12 面试题
销售人员中英文自荐信
2013/09/22 职场文书
工作自我评价怎么写
2014/01/29 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
植树节标语
2014/06/27 职场文书
大学计划书范文800字
2014/08/14 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS