js 点击与setTimeout执行顺序

code:

// 左侧菜单树操作
var isClick = false;
var i = 0;
$('.open_all').click(function () {
    i++;
    console.log("click"+i+":"+Date.parse(new Date()));
    if (isClick) {
        console.log("点击过快"+isClick);
        larryms.msg("点击过快",{time:500});
        return;
    }
    console.log(i+"准备开始执行");
    isClick = true;
    var this_node = $(this);
    setTimeout(function() {
        console.log("start"+i+":"+Date.parse(new Date())+isClick);
        // 以下代码在数据量为1000多时,会执行较长时间
        if (this_node.hasClass('close_all')) {
            leftMenuTree.jstree().close_all();
            this_node.removeClass('close_all').text('展开菜单树');
        } else {
            this_node.addClass('close_all').text('折叠菜单树');
            leftMenuTree.jstree().open_all();
        }

        isClick = false;
        console.log("end:"+Date.parse(new Date())+isClick);
    }, 0);
});

打印结果:
在这里插入图片描述

操作:连续点击8次。

看起来的执行顺序:

  1. 第1次点击事件主体,设置setTimeout
  2. 第1次点击的setTimeout内函数。(应该是主体代码执行较快,第二次点击还未发生)
  3. 第2次点击事件主体,设置setTimeout(应该是:第一次的setTimeout还未执行完毕过程中,发生第2-8次点击)
  4. 第3次点击事件主体。(跳过)
  5. 第4次点击事件主体。(跳过)
  6. 第5次点击事件主体。(跳过)
  7. 第6次点击事件主体。(跳过)
  8. 第7次点击事件主体。(跳过)
  9. 第8次点击事件主体。(跳过)
  10. 第2次点击的setTimeout内函数。(i值此时被自增到8)

参考链接:js 多线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值