JavaScript基础复习-异步

发布订阅

pubsub github

// 极小的发布订阅库
(function($) {

  var o = $({});

  $.subscribe = function() {
    o.on.apply(o, arguments);
  };

  $.unsubscribe = function() {
    o.off.apply(o, arguments);
  };

  $.publish = function() {
    o.trigger.apply(o, arguments);
  };

}(jQuery));

定时器

setTimeoutsetInterval

setTimeout除了第一个函数和第二个时间间隔外, 之后的参数作为第一个函数的参数依次传进去.

下面是一个通过setInterval方法实现网页动画的例子。

var div = document.getElementById('someDiv');
var opacity = 1;
var fader = setInterval(function() {
  opacity -= 0.1;
  if (opacity >= 0) {
    div.style.opacity = opacity;
  } else {
    clearInterval(fader);
  }
}, 100);

setInterval的一个常见用途是实现轮询。下面是一个轮询 URL 的 Hash 值是否发生变化的例子。

var hash = window.location.hash;
var hashWatcher = setInterval(function() {
  if (window.location.hash != hash) {
    updatePage();
  }
}, 1000);

setInterval指定的是“开始执行”之间的间隔,并不考虑每次任务执行本身所消耗的时间。因此实际上,两次执行之间的间隔会小于指定的时间。比如,setInterval指定每 100ms 执行一次,每次执行需要 5ms,那么第一次执行结束后95毫秒,第二次执行就会开始。如果某次执行耗时特别长,比如需要105毫秒,那么它结束后,下一次执行就会立即开始。

为了确保两次执行之间有固定的间隔,可以不用setInterval,而是每次执行结束后,使用setTimeout指定下一次执行的具体时间。

var i = 1;
var timer = setTimeout(function f() {
  // ...
  timer = setTimeout(f, 2000);
}, 2000);

上面代码可以确保,下一次执行总是在本次执行结束之后的2000毫秒开始。

防抖 debounce

$('textarea').on('keydown', debounce(ajaxAction, 2500));

function debounce(fn, delay){
  var timer = null; // 声明计时器
  return function() {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}

上面代码中,只要在2500毫秒之内,用户再次击键,就会取消上一次的定时器,然后再新建一个定时器。这样就保证了回调函数之间的调用间隔,至少是2500毫秒。


   转载规则


《JavaScript基础复习-异步》 lttztt 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
webstorm中使用filewatch转译es6 webstorm中使用filewatch转译es6
前言es6的语法也看了不少, 也用了一些, 不过是在vue的vue-cli中直接使用, 不需要自己安装babel. 可是,有时候自己写个小测试, 不想用框架的cli, 这是就需要自己配置babel了, 也折腾过webpack得loader
2018-11-10
下一篇 
JavaScript基础复习8-面向对象编程 JavaScript基础复习8-面向对象编程
为了与普通函数区别,构造函数名字的第一个字母通常大写 函数体内部使用this关键字, 代表了所要生成的对象的实例 生成对象的时候, 必须使用new命令 new命令执行构造函数, 推荐后面加括号var v = new V() 避免不使用
2018-11-05
  目录