vue+axios+promise实际开发用法详解


Posted in Javascript onOctober 15, 2018

axios它是基于promise的http库,可运行在浏览器端和node.js中,然后作者尤雨溪也是果断放弃了对其官方库vue-resource的维护,直接推荐axios库,小编我也是从vue-resource转换过来的,差别说不来,我们讲一下axios在实际开发中的用法

axios特点

1.从浏览器中创建 XMLHttpRequests
2.从 node.js 创建 http 请求
3.支持 Promise API
4.拦截请求和响应 (就是有interceptor)
5.转换请求数据和响应数据
6.取消请求
7.自动转换 JSON 数据
8.客户端支持防御 XSRF

安装axios和qs

npm i axios --save
npm i qs--save

创建项公共模块API

我是用vue-cli创建的项目在src->util->api.js(公共请求模块js)

引入axios和qs

import axios from 'axios'

有时候向后端发送数据,后端无法接收,考虑使用qs模块

import qs from 'qs'

判定开发模式

if (process.env.NODE_ENV == 'development') {  

  axios.defaults.baseURL = '/api';

}else if (process.env.NODE_ENV == 'debug') {  

  axios.defaults.baseURL = 'http://v.juhe.cn';

}else if (process.env.NODE_ENV == 'production') {  

  axios.defaults.baseURL = 'http://v.juhe.cn';

}

全局设置头部信息

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

全局设置超时时间

axios.defaults.timeout = 10000;

请求路由拦截

在请求发出去之前,可以做一些判断,看是否是合法用户

axios.interceptors.request.use(function (config) {
  // 一般在这个位置判断token是否存在
  return config;
  }, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

响应拦截

axios.interceptors.response.use(function (response){
   // 处理响应数据
  if (response.status === 200) {      
    return Promise.resolve(response);    
  } else {      
    return Promise.reject(response);    
  }
  }, function (error){
  // 处理响应失败
  return Promise.reject(error);
});

封装请求方法

使用ES6模块化export导出import导入

在ES6前, 前端就使用RequireJS或者seaJS实现模块化, requireJS是基于AMD规范的模块化库, 而像seaJS是基于CMD规范的模块化库, 两者都是为了为了推广前端模块化的工具,现在ES6自带了模块化,不过现代浏览器对模块(module)支持程度不同, 需要使用babelJS, 或者Traceur把ES6代码转化为兼容ES5版本的js代码;

get请求

export function get(url, params){  
  return new Promise((resolve, reject) =>{    
    axios.get(url, {      
      params: params    
    }).then(res => {
      resolve(res.data);
    }).catch(err =>{
      reject(err.data)    
    })  
  });
}

post请求

export function post(url, params) {
  return new Promise((resolve, reject) => {
     axios.post(url, qs.stringify(params))
    .then(res => {
      resolve(res.data);
    })
    .catch(err =>{
      reject(err.data)
    })
  });
}

实际使用

在main.js中引入js

import {get,post} from './utils/api'
//将方法挂载到Vue原型上
Vue.prototype.get = get;
Vue.prototype.post = post;

配置请求环境

这里通过devServer请求代理

当在请求过程中有/api字符串会自动转换为目标服务器地址(target)

devServer: {
  historyApiFallback: true,
  hot: true,
  inline: true,
  stats: { colors: true },
  proxy: {
   //匹配代理的url
   '/api': {
     // 目标服务器地址
       target: 'http://v.juhe.cn',
       //路径重写
       pathRewrite: {'^/api' : ''},
       changeOrigin: true,
       secure: false,
      }
   },
  disableHostCheck:true
  }

这是请求聚合数据的接口为列子

this.get('/toutiao/index?type=top&key=秘钥',{})
  .then((res)=>{
    if(res.error_code===0){
      resolve(res);
    }else{
      //这里抛出的异常被下面的catch所捕获
      reject(error);
    }
  })
  .catch((err)=>{
    console.log(err)
  })

返回数据

vue+axios+promise实际开发用法详解

使用promise

1.比如用户想请求url1接口完后再调url2接口

var promise = new Promise((resolve,reject)=>{
    let url1 = '/toutiao/index?type=top&key=秘钥'
    this.get(url,{})
    .then((res)=>{
      resolve(res);
    })
    .catch((err)=>{
      console.log(err)
    })
  });
  promise.then((res)=>{
    let url2 = '/toutiao/index?type=top&key=秘钥'
    this.get(ur2,{})
    .then((res)=>{
      //只有当url1请求到数据后才会调用url2,否则等待
      resolve(res);
    })
    .catch((err)=>{
      console.log(err)
    })
  })

Promise对象

  • Promise有三种状态
  • pending: 等待中,或者进行中,表示还没有得到结果
  • resolved: 已经完成,表示得到了我们想要的结果,可以继续往下执行
  • rejected: 也表示得到结果,但是由于结果并非我们所愿,因此拒绝执(用catch捕获异常)

这三种状态不受外界影响,而且状态只能从pending改变为resolved或者rejected,并且不可逆(顾名思义承诺的后的东西怎么又能返回呢)。在Promise对象的构造函数中,将一个函数作为第一个参数。而这个函数,就是用来处理Promise的状态变化

这里要注意,不管是then或者catch返回的都是一个新的Promise实例!而每个Primise实例都有最原始的Pending(进行中)到Resolve(已完成),或者Pending(进行中)到Reject(已失败)的过程

Promise基本用法

Promise.all()用法

var p = Promise.all([p1, p2, p3]);

all()接受数组作为参数。p1,p2,p3都是Promise的实例对象,p要变成Resolved状态需要p1,p2,p3状态都是Resolved,如果p1,p2,p3至少有一个状态是Rejected,p就会变成Rejected状态

Promise.race()用法

var p = new Promise( [p1,p2,p3] )

只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数,p的状态就会改变Resolved状态

Promise resolve()用法

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用.

Promise reject()用法

Promise.reject('foo')
// 等价于
new Promise(reject => reject('foo'))

Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。但是Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中删除指定数组中指定的元素的代码
Feb 12 Javascript
jQuery实现在列表的首行添加数据
May 19 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
IONIC自定义subheader的最佳解决方案
Sep 22 Javascript
jQuery Validate插件自定义验证规则的方法
Dec 27 Javascript
详解VueJs异步动态加载块
Mar 09 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
weex里Vuex state使用storage持久化详解
Sep 09 Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 Javascript
webpack多入口多出口的实现方法
Aug 17 Javascript
基于layui数据表格以及传数据的方式
Aug 19 Javascript
vue安装遇到的5个报错及解决方法
Jun 12 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 #Javascript
JS面试题大坑之隐式类型转换实例代码
Oct 14 #Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 #Javascript
详解ES6 Symbol 的用途
Oct 14 #Javascript
javascript实现文本框标签验证的实例代码
Oct 14 #Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
Oct 14 #Javascript
单页面vue引入百度统计的使用方法示例详解
Oct 13 #Javascript
You might like
推荐php模板技术[转]
2007/01/04 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
JavaScript类库D
2010/10/24 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
高中生学习生活的自我评价
2013/11/27 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
物业管理计划书
2014/01/10 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
保护环境的标语
2014/06/09 职场文书
会议室标语
2014/06/21 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
幼儿园辞职信
2015/05/13 职场文书
刑事起诉书范文
2015/05/19 职场文书
导游词之天下银坑景区
2019/11/21 职场文书