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 相关文章推荐
jquery怎样实现ajax联动框(二)
Mar 08 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
js实现鼠标经过时图片滚动停止的方法
Feb 16 Javascript
JavaScript转换与解析JSON方法实例详解
Nov 24 Javascript
初步使用bootstrap快速创建页面
Mar 03 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
解析利用javascript如何判断一个数为素数
Dec 08 Javascript
JavaScript奇技淫巧44招【实用】
Dec 11 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
Feb 05 Javascript
微信小程序实现自动定位功能
Oct 31 Javascript
laypage.js分页插件使用方法详解
Jul 27 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 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 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python后端接收前端回传的文件方法
2019/01/02 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
大学生的自我鉴定范文
2014/01/21 职场文书
总裁助理岗位职责
2014/02/17 职场文书
大学生作弊检讨书
2014/02/19 职场文书
绵山导游词
2015/02/05 职场文书
电影建国大业观后感
2015/06/01 职场文书
患者身份识别制度
2015/08/06 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server