您的位置:首页 > Web前端 > JavaScript

SCPPO(二十八):通过JS实现自动刷新进度

2016-11-20 21:37 295 查看

【前言】

    最近接到一个新的需求,这个需求还是蛮人性化的,开始的时候还真是没有思路;然后去网上进行了查找,并在系统中看已有模块有没有实现类似的功能的代码;皇天不负有心人,经过一番探索和实践最终实现了;个人觉得还蛮好玩的,在此与大家共享。

【探索之旅】

     一、需求:

         系统中有个测算功能(参考:《SCPPO(二十六):测算过程中问题的解决总结》);它的特点是计算复杂需要的时间长,这时候如何反馈给用户该功能进行到什么程度是非常有必要的;而且有利于客户向开发者反馈问题(比如执行在什么地方慢或卡死了等),有利于开发者快速定位和解决问题。

     二、实现方式:

         1、实现思路:

        
和组长商讨后决定在页面上用JS来控制实现这个效果,当用户使用该功能时,每1s去数据库中做下检查,查看当前存储过程执行的进度,反回界面显示。

         2、实现相关代码:

        (1)刷新方法:

function refreshOnTime() {
if (sawId !== "") {
$.ajax({
type: "post",
url: "/JobLog/JobLog/SearchProgress",
data: {
SawId: sawId,
_t: new Date().Format("yyyy-MM-dd hh:mm:ss")
},
dataType: "json",
success: function (e) {
var data = e.res;
if (e.success) {

if ($(data).length === 0) {
$("#msg").text("测算中......");
}
if ($(data).length === 29) {
$("#msg").text("测算成功");
endClock = clearInterval(endClock);
mini.get("cal").enable();
mini.get("issue").enable();
$.ajax({ url: "/XXX/FromSQLToRedis", async: false }); //测算完成后将数据库中的数据和缓存中的数据进行更新-zhanghan-2016年8月5日15:33:40
} else {
var pro = parseInt($(data).length / 29 * 100);
$("#msg").text(pro.toString() + "%");
}

} else {
$("#msg").text("测算失败");
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText);
}
});
}
}       
(2)测算调用刷新方法:
//测算方法
function cal() {
var date = mini.get("date").getFormValue();
var companykey = mini.get("Company").getValue();
$("#msg").text("测算中.....");

//当有企业在进行测算时将其他企业的测算和发布置为不可用
mini.get("cal").disable();
mini.get("issue").disable();

sawId = companykey + "_" + date + "_" + new Date().Format("yyyy-MM-dd hh:mm:ss");
$.ajax({
url: "@Url.Action("Calcultion")",
data: {
date: date,
companykey: companykey,
sawId: sawId,
_t: new Date().Format("yyyy-MM-dd hh:mm:ss")
},
type: "post",
success: function (text) {

},
error: function (jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText);
}
});

endClock = setInterval(refreshOnTime, 1000); //时间单位为毫秒
}   

     三、实现效果:

                 


      四、遇到问题及解决方案:

         
1、问题:

            效果是达到了,但是当很多企业都停留在这个页面时,对数据库的压力是很大的,于是乎爆发了数据库压力大,导致整个功能几近不能用的状态;参考:《SCPPO(二十九):测算过程中问题的解决总结(续)》;

         
2、解决方案:

            存储过程由于牵扯到的逻辑较为复杂,改起来比较困难,但是可以利用Redis来解决这个问题;相关思路:当企业开始执行测算时修改Redis中一个变量值,也面每1s中检测去Redis中检测,这样大大减小了数据库的压力。

【总结】

      1、多站在用户的角度去考虑问题,做出来的系统越人性化越好;

      2、思路很重要,遇到问题从多方面去思考,权衡各方面的利弊;

      3、建立系统思维,经常尝试从全局看问题,久而久之变养成这样的思维习惯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: