利用闭包只触发一次 / 只触发最新的事件 / 按照触发顺序执行事件 | 青训营

117 阅读1分钟

#青训营笔记创作活动 只触发一次 / 只触发最新的事件 / 按照触发顺序执行事件

当我们希望触发一个事件,只触发一次,或者只执行最后一次的时候,就可以利用闭包,创造一个高阶函数(函数返回值为函数)

只触发一次fn

当执行过fn后把fn变成null

funciton once(fn) {
    return function(...args) {
        if(fn) {
            const ret = fn.apply(this, args);
            fn = null;
            return ret;
        }
    }
}
只执行最新的事件
function debounce(fn, dur){
  //默认延迟时间100
  dur = dur || 100;
  var timer;
  return function(){
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, dur);
  }
}
一个一个time秒后调用fn
function consumer(fn, time){
  let tasks = [],
      timer;
  
  return function(...args){
    tasks.push(fn.bind(this, ...args));
    if(timer == null){
      timer = setInterval(() => {
        tasks.shift().call(this)
        //当没有任务时清除定时器
        if(tasks.length <= 0){
          clearInterval(timer);
          timer = null;
        }
      }, time)
    }
  }
}