Axios\fetch\async await

1,795 阅读4分钟

Axios

参考链接:www.jianshu.com/p/7a9fbcbb1… 安装 npm init -y :初始化一个配置文件; npm install axios --save :生产依赖; npm install axios --save-dev :开发依赖;

package.json :配置文件;记录了该项目依赖了哪些模块;

下载axios之后,需要引入axios:

<script src="./node_modules/axios/dist/axios.js"></script>

axios基于promise用于浏览器和node.js的http客户端

特点

  • 支持浏览器和node.js
  • 支持promise
  • 能拦截请求和响应
  • 能转换请求和响应数据
  • 能取消请求
  • 自动转换JSON数据
  • 浏览器端支持防止CSRF(跨站请求伪造)

axios().then

axios会默认返回一个promise的实例;可以调用. then方法;

axios.get("index.css").then(function(data){
	console.log(data);
}).catch(function () {
	console.log(100);
})

可以看到我们请求的数据并不在data身上,被重新包装了,data.data才是我们请求的数据;

axios.get("index.css").then(function(data){
	console.log(data.data);
}).catch(function () {
	console.log(100);
})

axios请求的数据a,会把服务器返回的数据放在a的data属性上; 如果数据请求失败会执行catch;

axios请求

axios默认get请求;

// 发起一个GET请求(GET是默认的请求方法)
axios('/user/12345');

axios.get

axios.get("index.css").then(function (a) {
	// axios请求到的数据,会把服务器返回的数据放在a的data属性上;
	console.log(a.data); //a是一个对象
	return axios.get("/login.css");
}).then(function(data){
	//第二个.then会受上一个.then中return的axios.get("/login.css")结果的影响;axios.get("/login.css")请求成功会执行/第二个.then;失败就直接执行catch;
}).catch(function () {
	console.log(100);
})

axios.post

axios.post("index.css")

axios.all

同时发生的请求 一下两个用来处理同时发生多个请求的辅助函数 axios.all(iterable) axios.spread(callback)

function getUserAccount() {
	return axios.get('/user/12345');
}

function getUserPermissions() {
	return axios.get('/user/12345/permissions');
}
//axios.all的参数是一个数组;
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {}) );

axios传参

get请求的传参 params:参数;其属性值是一个对象;用于请求传递参数

axios.get("index.css",{params:{user:"a"}}).then(function (a) {
	console.log(a.data);
})

post请求的传参

axios.post("index.css",{user:"a",password:123}).then(function (a) {
	console.log(a.data);
}).catch(function () {
	console.log(100);
})

axios api

可以通过导入相关配置发起请求

axios({
  method:'post',   //ajax中请求类型使用的是type;
  url:'http://bit.ly/2mTM3nY',
  data:{
	  username:"aaa",
	  password:123
  }
}).then(function(response) {
  
});

axios.creat()

每次请求都创建一个新的实例

var instance = axios.create({
	baseURL: 'https://some-domain.com/api/',  //基础路径
	timeout: 1000,
	headers: {'X-Custom-Header': 'foobar'}
});

axios配置基础路径

axios.defaults.baseURL = 'https://api.example.com';
axios.get("index.css").then(function () {
})
//会拼成https://api.example.com/index.css

配置优先级

配置项通过一定的规则合并,request config > instance.defaults > 系统默认,优先级高的覆盖优先级低的。

// 创建一个实例,这时的超时时间为系统默认的 0
var instance = axios.create();
// 通过instance.defaults重新设置超时时间为2.5s,因为优先级比系统默认高
instance.defaults.timeout = 2500;
// 通过request config重新设置超时时间为5s,因为优先级比instance.defaults和系统默认都高
instance.get('/longRequest', {
	timeout: 5000
});

拦截器interceptors

axios.interceptors.request.use() 可以在then和catch之前拦截请求和响应。

// 请求拦截
axios.interceptors.request.use(function (config) {
	// 当发送请求之前,会先执行这个函数;
	// 每当发送一个请求,都会拦截一次;
	console.log(100);
	return config;
})
axios.get("index.css").then(function () {
	console.log(200);
})
axios.post("index.css").then(function () {
	console.log(300);
})
//输出的结果为100  100  300  200;

当post请求和get请求同时存在时,先执行post请求,再执行get请求; 原因:post请求比get请求快,都是异步的,post请求的时间先到,所以先执行post请求; 如果之后想移除拦截器你可以这么做

var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

你也可以为axios实例添加一个拦截器

var instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

取消请求

可以通过cancel token来取消一个请求; CancelToken.source

var CancelToken = axios.CancelToken;
var source = CancelToken.source();
axios.get('/user/12345', {
	cancelToken: source.token
}).catch(function(thrown) {
	if (axios.isCancel(thrown)) {
		console.log('Request canceled', thrown.message);
	} else {
    // handle error
	}
});
//取消请求
source.cancel('Operation canceled by the user.');

fetch

fetch是window中的一个属性名,其属性值是一个可以发请求的函数; Fetch 还利用到了请求的异步特性——它是基于Promise的。 fetch : 默认调用的是get请求;

fetch("package.json",{
	method:"post",
	body:JSON.stringify({a:1,b:2}),  //body必须传字符串
	headers:{ //设置请求头
		'content-type':'x-www-form-urlencoded'
	},
	credentials:'include'
}).then(function (res) {
	// res.json()同样会返回一个promise实例;继续.then才能获取其数据;
	return res.json();
}).then(function (data) {
	console.log(data);// 需要访问的数据;
})

调用fetch函数,传入接口url,然后返回一个promise,为了获取JSON的内容,我们需要使用 json()方法,这个方法返回的也是一个promise; fetch的参数

  1. method:HTTP请求方式,默认为get请求;string格式;
  2. body:HTTP的请求参数;string格式;
  3. headers:HTTP的请求头,默认为{};object格式;
  4. credentials:默认为omit,忽略的意思,也就是不带cookie;还有两个参数,same-origin,表示同源请求带cookie;include表示无论跨域还是同源请求都会带cookie;

注意:get请求不能设置body,只能通过问号传参的方式;

浏览器对Fetch的支持度不好,可以基于babel的最新语法解析包,把其进行解析,想要兼容性好一些,需要使用“fetch pollyfill”

async await

async函数是ES6的新语法;使得异步操作变得更加方便。 使用关键字async来表示,在函数内部使用await来表示异步。

async函数中如果没有await,那么和普通函数一样的; 一旦加了await;那么await下面的代码就是异步的;