说明
今天优化项目结构,发现有如下一个函数
const drawMqiPie = async (index) => {// 请求的参数let params = {lineNo: lineNo,direct: 1,driveway: 1,pageNum: 0,pageSize: 0,computeRange: 3,detectDate: $('#detectYear').val() + '-01-01'}// 请求的urllet url = conf.URL + 'system/linePqi/list';// 调用方法获取数据let data = await mar.$post(url, params);let pieData = [0, 0, 0, 0, 0];// 处理数据if (data.code == 200) {optionPie.series[0].data = [];option.xAxis[0].data = [];option.series[0].data = [];for (var i = 0; i < data.data.list.length; i++) {var everydata = data.data.list[i];everydata.mqi = (0.08 * everydata.sci + 0.7 * everydata.pqi + 0.12 * everydata.bci + 0.1 * everydata.tci);if (everydata.mqi >= 90) {pieData[0] = pieData[0] + parseFloat(everydata.endNum - everydata.startNum);} else if (everydata.mqi > 80) {pieData[1] = pieData[1] + parseFloat(everydata.endNum - everydata.startNum);} else if (everydata.mqi > 70) {pieData[2] = pieData[2] + parseFloat(everydata.endNum - everydata.startNum);} else if (everydata.mqi > 60) {pieData[3] = pieData[3] + parseFloat(everydata.endNum - everydata.startNum);} else {pieData[4] = pieData[4] + parseFloat(everydata.endNum - everydata.startNum);}}optionPie.series[0].data.push({ value: pieData[0] / 1000, name: '优', itemStyle: { color: colors[0], fontSize: 18 } });optionPie.series[0].data.push({ value: pieData[1] / 1000, name: '良', itemStyle: { color: colors[1], fontSize: 18 } });optionPie.series[0].data.push({ value: pieData[2] / 1000, name: '中', itemStyle: { color: colors[2], fontSize: 18 } });optionPie.series[0].data.push({ value: pieData[3] / 1000, name: '次', itemStyle: { color: colors[3], fontSize: 18 } });optionPie.series[0].data.push({ value: pieData[4] / 1000, name: '差', itemStyle: { color: colors[4], fontSize: 18 } });optionPie.title.text = "公路技术状况MQI饼状图";mar.echarts.draw($dom, optionPie);layer.close(index);}
}
说明:
1.上面的函数是调用echarts画图功能,画一个饼状图
2.虽然注释写的比较清楚,但后面过几天来看,还是会带来一定的阅读障碍.
优化
- 下面开始优化
- 仔细阅读函数可以发现,该画图函数主要分为3点
1.获取数据: 包括data、和Option
2.处理数据: 根据Ajax请求回来的数据,更改Option
3.画图: 根据最后的Option和Dom画图. - 更改后的函数如下
// 画折线图
const drawLine = async (index) => {// 获取数据let { data, optionLine } = await getLineData();// 处理数据optionLine = handleLineData(data, optionLine);// 画图mar.echarts.draw($domLine, optionLine);// 关闭加载页面layer.close(index);
}
- 当你看到上面这样的函数的时候,是不是感觉不那么慌了,
- 其实就做了一点点改进.
异步请求数据的同步写法
- 写在Mar类的通用方法里面.
- 主要是对
jquery
的$post
方法的封装:
class Mar {constructor( conf ){const { jquery } = conf;this.$ = jquery;}async $post (url, params) {// 调用jquery的ajax方法return this.$.post(url, params, '', 'json');}
}
- 调用该方法
const Mar = require('./Mar');
const jequery = require('./jequery');
const mar = new Mar({ jequery });
const url = 'http://xxx:port/path';
const params = {pageSize: 0,pageNo: 0
};let data = await mar.$post(url, params);
console.log(data);
说明:
通过这种方式,可以很优雅的实现异步方法.从而摆脱回调地狱的困扰。使程序看起来更美观,更方便后续的阅读和维护.