React项目配置7(ES7的Async/Await的使用)
本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章!
1、React项目配置1(如何管理项目公共js方法)---2018.01.11
2、React项目配置2(自己封装Ajax)---2018.01.12
3、React项目配置3(如何管理项目API接口)---2018.01.15
4、React项目配置4(如何在开发时跨域获取api请求)---2018.01.16
5、React项目配置5(引入MockJs,实现假接口开发)---2018.01.17
6、React项目配置6(前后端分离如何控制用户权限)---2018.01.18
7、React项目配置6(ES7的Async/Await的使用)---2018.01.19(新增)
开发环境:Windows 8,node v8.9.1,npm 5.5.1,WebStorm 2017.2.2
我们今天讲下ES7的Async/Await的使用!
1、首先需要改造下AJAX请求
我们新建 xmlNative.js文件,把公共部分抽取出来!
const xmlNative = (opt, type) => {
opt = opt || {};
opt.method = opt.method.toUpperCase() || 'POST';
opt.url = opt.url || '';
opt.async = opt.async || true;
opt.data = opt.data || null;
opt.success = opt.success || function () {
};
let xmlHttp = new XMLHttpRequest();
if (opt.method.toUpperCase() === 'POST') {
xmlHttp.open(opt.method, opt.url, opt.async);
xmlHttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xmlHttp.send(JSON.stringify(opt.data));
} else if (opt.method.toUpperCase() === 'GET') {
let params = [];
for (let key in opt.data) {
params.push(key + '=' + opt.data[key]);
}
let postData = params.join('&');
xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
xmlHttp.send(null);
}
if (type === 1) {
return new Promise((resolve, reject) => {
xmlHttp.onreadystatechange = () => {
if (xmlHttp.readyState === 4) {
if (xmlHttp.status === 200) {
let responseText = JSON.parse(xmlHttp.responseText);
if (responseText.code === 0) {
resolve(responseText.data)
} else {
reject(responseText.message)
}
} else {
reject(JSON.parse(xmlHttp.responseText), xmlHttp.status)
}
}
};
})
} else {
xmlHttp.onreadystatechange = () => {
if (xmlHttp.readyState === 4) {
if (xmlHttp.status === 200) {
opt.success(JSON.parse(xmlHttp.responseText), xmlHttp.status)
} else {
opt.error(JSON.parse(xmlHttp.responseText), xmlHttp.status)
}
}
};
}
};
export default xmlNative
2.修改之前的 apiRequest.js
import xmlNative from './xmlNative'
import apiManager from './apiManager'
const ajax = (url, method, data, successCB, errorCB) => {
let dataJson = {
version: "1.0.0",
data: data
};
return xmlNative({
method: method,
url: url,
data: dataJson,
success: (data, status) => {
if (data.code === 0) {
successCB && successCB(data, status)
} else {
errorCB ? errorCB(data, status) : console.log(data, status)
}
},
error: (data, status) => console.log(status, status)
});
};
const apiRequest = {
get: (apiName, data, successCB, errorCB) => ajax(apiManager[apiName], "get", data,
data => successCB && successCB(data.data, data.systemDate),
errorCB),
post: (apiName, data, successCB, errorCB) => ajax(apiManager[apiName], "post", data,
data => successCB && successCB(data.data, data.systemDate),
errorCB)
};
export default apiRequest;
3.新建apiRequestAsync.js
import xmlNative from './xmlNative'
import apiManager from './apiManager'
const ajax = (url, method, data) => {
let dataJson = {
version: "1.0.0",
data: data
};
return xmlNative({
method: method,
url: url,
data: dataJson
}, 1);
};
const apiRequestAsync = {
get: (apiName, data) => ajax(apiManager[apiName], "get", data),
post: (apiName, data) => ajax(apiManager[apiName], "post", data)
};
export default apiRequestAsync;
到这里就封装完了,我讲解下一些地方,如果没讲到的地方,大家不懂的可以留言问我!
if (type === 1) {
return new Promise((resolve, reject) => {
xmlHttp.onreadystatechange = () => {
if (xmlHttp.readyState === 4) {
if (xmlHttp.status === 200) {
let responseText = JSON.parse(xmlHttp.responseText);
if (responseText.code === 0) {
resolve(responseText.data)
} else {
reject(responseText.message)
}
} else {
reject(JSON.parse(xmlHttp.responseText), xmlHttp.status)
}
}
};
})
这个type完全是自定义的,type===1的时候,返回一个Promise,因为await等待的就是一个 Promise!
4.我们来测试一下
先看看原来的请求是否还正常
一切正常!
5.为什么要用 es7 async await
它主要是为了解决如下场景:
比如需求是我的请求的某个参数是需要上一个请求的结果:
类是于这样:
这样请求下去,会进入到回调地域里!
所有用es7 async await来解决这个问题
6、那怎么写呢?
其实也很简单,之前我们已经封装好了,我们来写下试试!
这里需要安装一个依赖,
npm i -S babel-polyfill
引入
import "babel-polyfill";
import apiRequestAsync from '../../../public/js/apiRequestAsync';
书写 es7 async await
async handleTodoList() {
let todoList = await apiRequestAsync.post('todoList');
this.setState({list: todoList.list});
let todoList1 = await apiRequestAsync.post('todoList');
console.log(todoList1);
let todoList2 = await apiRequestAsync.post('todoList');
console.log(todoList2);
}
OK,看下浏览器效果
它渲染了 todolist,也打印出了todoList1及todoList2。
- 存储状态数据
- Oracle数据库设置为归档模式的操作方法
- flash/flex 与 FluorineFx通讯之Hello World!
- 苹果CEO首次泄露出自动驾驶汽车的相关战略信息
- Linux下绑定网卡的操作记录
- flash开发中如何实现界面代码分离
- flex中使用swc实现更好的界面代码分离
- Redis Cluster集群总结性梳理
- jquery的html,text,val
- Redis Cluster日常操作命令梳理
- MongoDB数据存储-深入了解
- Linux下通过受限bash创建指定权限的账号
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (上)
- MongoDB副本(一主一备+仲裁)环境部署记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt编写安防视频监控系统32-onvif信息获取
- Qt编写安防视频监控系统33-onvif云台控制
- Qt编写安防视频监控系统34-onvif事件订阅
- Qt编写安防视频监控系统35-onvif抓拍图片
- Qt音视频开发1-vlc解码播放
- 【TBase开源版测评】分布式数据自动shard分片
- STL—mt19937
- 潘石屹用Python解决100个问题 | 字符类型统计
- 潘石屹用Python解决100个问题 | 分解质因数
- 使用Java Spring消费MySQL中的数据库存储过程
- 部署 Docker 及配置
- 【Spark on K8S】Spark里的k8s client
- 【每日一题】30. Substring with Concatenation of All Words
- MySQL选错索引导致的线上慢查询事故复盘
- 【Kubernetes】additionalPrinterColumns的配置