vue+axios+promise实际开发用法

时间:2022-08-29 19:44:27

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

如何在 Vue.js 中使用第三方库

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方法不一致。

原文地址:https://segmentfault.com/a/1190000016680014

vue+axios+promise实际开发用法的更多相关文章

  1. vue结合Promise及async实现高效开发。

    在vue中平时的开发中我们应该都会遇到promise函数,比如我们常用的axios,resource这都是用来做http请求的插件. 在平时的开发里,关于axios我们可能是这样写的 import a ...

  2. 【06】Vue 之 组件化开发

    组件其实就是一个拥有样式.动画.js逻辑.HTML结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色.尤其是她 ...

  3. vue --- axios , vuex

    一 . 内容回顾 1.webpack(前端中工作,项目上线之前对整个前端项目优化) - entry:整个项目的程序入口(main.js或index.js): - output:输出的出口: - loa ...

  4. 基于Vue + axios + WebApi + NPOI导出Excel文件

    一.前言 项目中前端采用的Element UI 框架, 远程数据请求,使用的是axios,后端接口框架采用的asp.net webapi,数据导出成Excel采用NPOI组件.其业务场景,主要是列表页 ...

  5. 循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

    在我们开发Vue应用的时候,很多时候需要记录一些变量的内容,这些可以用来做界面状态的承载,也可以作为页面间交换数据的处理,处理这些内容可以归为Vuex的状态控制.例如我们往往前端需要访问后端数据,一般 ...

  6. 全栈的自我修养: 001环境搭建 (使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发)

    全栈的自我修养: 环境搭建 Not all those who wander are lost. 彷徨者并非都迷失方向. Table of Contents @ 目录 前言 环境准备 nodejs v ...

  7. spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

     前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...

  8. Flask Vue.js全栈开发

    Flask Vue.js全栈开发的 最新完整代码 及使用方式 本系列的最新代码及使用方式将持续更新到: http://www.madmalls.com/blog/post/latest-code/ 1 ...

  9. vue axios拦截器 + 自编写插件 实现全局 loading 效果;

    项目需求:用自定义的 .gif 图标实现全局 loading 效果:为避免在每个页面手动添加,且简单高效的实现,经查阅资料,最终采用了 vue axios拦截器 + 自编写 loading 插件:下面 ...

随机推荐

  1. C#string类型总结

    字符串的特性:不可变性,每对字符串做拼接或者重新赋值之类的操作,都会在内存中产生一个新的实例.  所以说,在.Net平台下,如果你对一个字符串进行大量的拼接赋值等操作,会产生大量的垃圾.    --- ...

  2. 多种姿势破解centos OR readhat enterprises 7.X root密码

    NO:1 启动系统,在grub界面按"e"键,进入编辑模式,找到以"linux16"开始的行,在行尾加入"rd.break",按" ...

  3. Careercup - Facebook面试题 - 5890898499993600

    2014-05-01 02:30 题目链接 原题: Given a matrix of letters and a word, check if the word is present in the ...

  4. 百度上传插件WebUploader,angularjs指令封装

    1.WebUploader特点 官网地址:http://fex.baidu.com/webuploader/ 1.1 分片.并发 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上 ...

  5. 使用HashMap对象传递url參数有用工具类

    代码例如以下: package com.yanek.util; import java.util.ArrayList; import java.util.Collections; import jav ...

  6. Java-IO之CharArrayWriter(字符数组输出流)

    CharArrayWriter用于写数据,数据单位是字符. (1) 通过CharArrayWriter()创建的CharArrayWriter对应的字符数组大小是32. (2) 通过CharArray ...

  7. Sublime Text 2 绿化与汉化 [Windows篇]

    其实 ST3 已经出了很久了,可是我这个人恋旧,一直钟爱 ST2,所以就选择她了.最近我的 ST2 越来越卡,甚至有时候输入都会延迟1秒,所以打算自己搞个绿化版. 打开 Sublime Text 官网 ...

  8. Android Fragment与Activity通讯详解

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  9. VSTS 更名为 Azure DevOps

    微软正式对外宣布Azure DevOps,其实就是原来的VSTS,我们来看一下Azure DevOps的介绍: 今天我们宣布Azure DevOps.与世界各地的客户和开发人员合作,很明显,DevOp ...

  10. [转] 29个你必须知道的Linux命令

    总结: 1. find  查找文件 2. grep 查找某个文件或者文件夹里面文件的内容 29个你必须知道的Linux命令 虽然Linux发行版支持各种各样的GUI(graphical user in ...