js脚本中定时器太多,冲突如何解决?

命中水ヽ
  • 4.9k

业务需要,在js脚本中,写了多个定时任务,如下代码:

setTimeout(cron, 120000);//定时上传记录信息
setTimeout(start_init, 350000);

function cron() {
    $.post('cron.php', {state: 'cron'}, function(data) { });
    setTimeout(cron, 120000);
}

function start_init() {
    $.post('start_init.php', {state: 'start_init'}, function(data) { });
    setTimeout(start_init, 350000);
}

/**
* 这段是逻辑处理
**/
var clear_t;
document.onkeydown = function(e){  
    var ev = document.all ? window.event : e;
    if(ev.keyCode==13) {
        clearTimeout(clear_t);

        $.post('ajax.php', send_data, function(data) {
            var jsonRes = JSON.parse(data);
            if(jsonRes.status == 202) {
                /**业务代码块**/

            }else if(jsonRes.status == 200 || jsonRes.status == 2000) {
                /**业务代码块**/

            }else {
                /**业务代码块**/
            }
            clear_t = setTimeout(clear_content, 5000);
        }
    }
}

/**
 * 更改页面部分信息的方法
 */
function clear_content() {
    $("#username").text('******'); 
    $("#useroperations").text('******'); 
    $("#last_balance").text(0);
    $("#consum").text(0); 
    $("#now_balance").text(0);
    local_soc.emit('cum_num', 0);
}

如上述代码所示(代码最上面的两个定时器没有什么特别意义,贴出来是为了说明这个脚本中定时器很多),js脚本中用到了很多的定时器,那么这些定时器,异步向服务器发送请求的就不说了,就是更改页面部分信息clear_content方法这里,有时候容易断片儿,时不时的不会执行这段代码,请问像这样的是由于多个定时器冲突造成的吗?那么应该如何避免这样的问题?或者如何改进这段程序块?

对了,特别说明一下,捕获鼠标回车事件,也就是最下面的代码块执行的很频繁,差不多3~5s就会执行一次。

回复
阅读 7.1k
5 个回答

clear之后就不执行了啊。。。你的逻辑自己有问题啊,而你取消执行到执行有至少5秒时间,所以有段时间不执行很正常啊,如果你5回车之后5秒不回车那才会执行。

应该是逻辑出了些问题,代码问题,一般都是作者的逻辑引起的,如果坚持使用setTimeout,那就需要仔细读一哈逻辑,最上面两个方法没有清除setTimeout,然后又重新监听了,在从新监听之前,使用clearTimwout()清除定时器。

最好实现模块化,很好的避免冲突。可以试下require.js

var tm_cron = setTimeout(cron, 120000);//定时上传记录信息
var tm_start_init = setTimeout(start_init, 350000);

function cron() {
    clearTimeout(tm_cron);
    $.post('cron.php', {state: 'cron'}, function(data) { });
    tm_cron = setTimeout(cron, 120000);
}

function start_init() {
    clearTimeout(tm_start_init);
    $.post('start_init.php', {state: 'start_init'}, function(data) { });
    tm_start_init = setTimeout(start_init, 350000);
}
宣传栏