收藏
回答

短时间内多次执行 setInterval 和 clearInterval,会跳过延迟直接执行?


/**
 * 判断是否双击,如果是双击则执行success 方法
 *
 * 注意:不能将 setTimeout 换成 setInterval ,setInterval 存在bug,延迟毫秒数太低 会出现 直接执行的情况。
 * that : 当前页面的 this 对象
 */
function doubleClickToDo(that, success) {
  
    console.log(that.doubleClickSum);
  
    that.doubleClickSum = notEmpty(that.doubleClickSum) ? that.doubleClickSum : 0;
  
    if (that.doubleClickSum > 0) {
  
        // console.log('>0')
  
        success();
        //执行完成之后也要重置,否则执行完成之后的第一次会跳到 else 去
        that.doubleClickSum = 0;
        that.doubleClickInterval = null;
        //500 毫秒内再次点击了,清楚定时器
        clearInterval(that.doubleClickInterval)
  
    } else {
        // console.log('=0')
        that.doubleClickSum += 1;
        //如果没有定时器,则设置定时器,500 毫秒后自动 重置 doubleClickSum
        if (!notEmpty(that.doubleClickInterval)) {
  
            that.doubleClickInterval = setInterval(() => {
  
                clearInterval(that.doubleClickInterval);
                that.doubleClickSum = 0;
                that.doubleClickInterval = null;
  
            }, 500);
        }
    }

}


/**
 
 * 判空
 
 */
 
function notEmpty(attribute) {
 
     if (attribute !== null && attribute !== "null" && attribute !== undefined && attribute !== 'undefined' && attribute !== '') {
 
         return true;
 
     } else {
 
         return false;
 
     }
 
}


调用:

//(每次)点击 tabbar 的当前tabitem 时执行
onTabItemTap(item) {
 
    //判断双击,双击后自动滚动到顶部
    utils.doubleClickToDo(this, success => {
 
        console.log('runing ...' + this.doubleClickSum)
        wx.pageScrollTo({
            scrollTop: 0,
            success: res => {
                console.log(res.errMsg);
            }
        })
 
    });
 
},


说明:

        如题,在短时间(疯狂点击tabbar按钮调用 onTabItemTap )多次调用 doubleClickToDo 方法,多次执行之后,会出现 直接运行 setInterval 回调函数的情况,出现 that.doubleClickSum  一直为0 的情况。将 setInterval 和 clearInterval 换成 setTimeout 和 clearTimeout,则不会出现这种情况。



最后一次编辑于  11-07
回答关注问题邀请回答
收藏

1 个回答

问题标签