在执行耗时比较长的任务时浏览器总是一个“圈”在哪转,焦急等待之后可能还给你来个超时,解决超时的问题百度一堆,现在主要解决“执行进度状态”。
项目是基于thinkadmin框架写的(Thinkphp6+LayUI),查了layui文档,有个进度条的组件progress,地址是:https://layuion.com/docs/element/progress.html。
实现的思路:dataPro为主程序,getStauts为dataPro的进度查询程序,前端利用js异步获取getStatus的返回值即可实现进度条的动态更新。
在程序dataPro中加入一个session或者redis、缓存、本地文件之类的(可能是我对框架不熟,就是TP框架下的session是在程序执行完之后写入的,意味着程序在执行过程中是获取不到session的,不知道我这么理解对不对,总之实践中获取到的是所有任务执行完了的最终session,估计要等到真大神来解释了),既然session用不了,就用了写文件(自己用不要紧,如果是多用户,可能会有点问题)。
后端代码如下:
public function dataPro(){
$num = 1000;//任务总量
$i = 1;
//模拟数据处理
...主要执行的程序
//任务进度百分比,这个值要传给前端组件
$percent = $i / $num * 100;
//打开文件
$f = fopen('tmp.txt','w');
fwrite($f,$percent);
fclose($f);
...执行结束
return 返回执行结果;
}
public function getstatus(){
//状态查询,供前端ajax异步调用
//读取文件
$f = fopen('tmp.txt','r');
$percent = fgets($f);
fclose($f);
//返回百分比
return $percent;
}
前端代码:
<div class="layui-progress layui-progress-big" lay-filter="progress" lay-showPercent="yes" >
<div id = "demo" class="layui-progress-bar layui-bg-green" lay-percent="1%" ></div>
</div>
<script>
$("#withExport").click(function () {
// 执行数据处理程序
$.ajax({
//向后端程序dataPro发起请求
url:'api/dataPro',
success:function (data) {
console.log('这里是数据处理结果:',data);
}
});
// 执行进度条
layui.use('element', function(){
var element = layui.element;
var scanTime = 1000; //定义执行周期,1秒钟
var timer = setInterval(function (){
//每1秒执行一次
$.ajax({
url: 'api/getstatus',
success: function (data) {
//动态设置百分比,就是getstatus返回的结果
var percent = data;
element.progress('progress', percent +'%')
if(percent == 100){
clearInterval(timer); //进度到100%,关闭定时器
}
},
error: function (e) {
//关闭定时器
clearInterval(timer);
}
});
}, scanTime);
});
});
</script>
效果如下:
肯定不是最优解,但是解决眼前的问题了。