基本介绍

  • setTimeout 延时执行

    setTimeout(fn,1000),1000ms后执行fn

  • setInterval 定时器

    setInterval(fn,100),每隔100m执行fn

特别注意

  • setTimeout执行时间可能会给定时间。
  • setInterval间隔执行的时间可能会给定时间。

setTimeout

  • JavaScript引擎在执行setTimeout(fn, 10)时,一方面继续执行setTimeout(fn, 10)后面的同步代码,同时另一方面开始计时,在10ms之后将fn插入任务队列中。待所有同步代码执行结束后(JavaScript引擎空闲),依次任务队列中的异步代码。所以,setTimeout(fn, 10)并不能准确的在10ms之后执行,而是大于等于10ms。
  • 代码一(正常)
console.time("time")
setTimeout(function(){console.timeEnd("time")},10);
复制代码

输出:time:10.9619140625ms

  • 代码二(超时)
console.time();
var i = 0;
for(var s =1;s<100000;s++){i += s;
};
setTimeout(function(){console.timeEnd()},10);
复制代码

输出:time:24.440185546875ms

setInterval

  • 与setTimeout()相同的是,如果当前没有同步代码在执行(JavaScript引擎空闲),则定时器对应的方法fn会被立即执行,否则,fn就会被加入到任务队列中。
  • 由于定时器的事件是每隔10ms就触发一次,有可能某一次事件触发的时候,上一次事件的处理方法fn还没有机会得到执行,仍然在等待队列中,这个时候,这个fn事件就被丢弃,继续开始下一次计时。
  • 需要注意的是,由于JavaScript引擎这种单线程异步的执行方式,有可能两次fn的实际执行时间间隔小于设定的时间间隔。比如上一个定时器事件的处理方法触发之后,等待了5ms才获得被执行的机会。而第二个定时器事件的处理方法被触发之后,马上就被执行了。那么这两者之间的时间间隔实际上只有5ms。
var IntervalId= setInterval(function(){console.log(Date.now())},10);
var i = 0;
for(var s =1;s<1000000;s++){i += s;
};
setTimeout(function(){clearInterval(IntervalId)},100);
复制代码

输出:

1525943129602
1525943129607 // 距离上一次只间隔了5ms
1525943129618
1525943129628
1525943129639
1525943129648
1525943129657
1525943129669
1525943129678
1525943129688
1525943129699
复制代码
  • setInterval()并不适合实现精确的按固定间隔的调度操作。
  • 比如在处理动画帧数时,就不适合用setInterval,而应采用requestAnimationFrame方法。
// 简单粗暴的方法
var FPS = 60;
setInterval(draw, 1000/FPS);
// 当draw方法执行耗时大于1000/60 ms时,就会发生丢帧的现象。
复制代码

总结

setTimeout()和setInterval()都不能满足精确的时间间隔。假如设定的时间间隔为10ms,则setTimeout(fn, 10)中的fn执行的时间间隔可能大于10ms,而setInterval(fn, 10)中fn执行的时间间隔可能小于10ms。

转载于:https://juejin.im/post/5af40609f265da0b93485451

js异步之setTimeout与setInterval相关推荐

  1. JS中的setTimeout和setInterval函数

    目录 前言 setTimeout setTimeout()函数应用之点名器 setInterval setInterval应用之重写点名器 前言 在生活中,常有定时做某事,或者循环做某事的需求,如设置 ...

  2. js基础之setTimeout与setInterval原理分析

    setTimeout与setInterval概述 setTimeout与setInterval是JavaScript引擎提供的两个定时器方法,分别用于函数的延时执行和循环调用.前者的主要思想是通过一个 ...

  3. js中计时器setTimeout、setInterval、requestAnimationFrame区别

    转载自:https://www.cnblogs.com/xiaohuochai/p/5777186.html 本文仅用于作为学习笔记 计时器一直是javascript动画的核心技术.而编写动画循环的关 ...

  4. JS 自定义用setTimeout 实现 setInterval功能

    自定义用setTimeout 实现 setInterval功能 // setTimeout(function() {// console.log('定时炸弹') // },1000)// setInt ...

  5. JS自定义用setTimeout 实现 setInterval功能

    自定义用setTimeout 实现 setInterval功能 // setTimeout(function() { // console.log('定时炸弹') // },1000)// setIn ...

  6. 【JS基础】setTimeout、setInterval、clearTimeout、clearInterval

    定时器 JS设置定时器和清除定时器 ​ 在做项目中难免会碰到需要实时刷新,动画依次出现等等需求,这时候就需要定时器登上我们的代码舞台了,所以今天我们就先来了解一下JS定时器的设置和清除吧. 一.启用定 ...

  7. js异步与同步的区别

    你应该知道,javascript语言是一门"单线程"的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条 ...

  8. js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...

    javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...

  9. JavaScript———从setTimeout与setInterval到AJAX异步

    setTimeout与setInterval执行 首先我们看一下以下代码打印结果 1 2 3 4 5 6 7 console.log(1); setTimeout(function() { conso ...

  10. 用故事解析setTimeout和setInterval(内含js单线程和任务队列)

    用故事解析setTimeout和setInterval(内含js单线程和任务队列) 区别: setTimeout(fn,t): 延迟调用,超过了时间就调用回调函数,返回一个id,使用clearTime ...

最新文章

  1. 特殊字符与语义化标签
  2. mvp关联activity生命周期_Rxjava+Retrofit统一异常处理与生命周期管理
  3. linux mysql 指令无效_linux下安装mysql,mysql命令失效的原因
  4. 1. 变量提升 2. 条件语句 3. 循环语句 弹出框的三种形式 If条件的种类...
  5. html5 formdata api,HTML5 API FormData --- 使用
  6. python参数类型_Python 参数类型和参数匹配模型
  7. thinkphp mysql日志_MySQL的日志基础知识及基本操作学习教程
  8. 90TB显存!英伟达发布新一代SuperPod超算,AI算力新巅峰!
  9. AlldayTest 产品使用--文件
  10. python 强类型 弱类型_强类型、弱类型
  11. python必背入门代码-python必背内容有哪些
  12. 结构力学求解器_结构力学学好这些内容对施工很关键,你都学懂了吗?
  13. css3实现浮动元素垂直水平居中
  14. linux网卡驱动probe函数详解
  15. 孵出鸡蛋然后拿去卖钱
  16. JAVA 文件分割工具类
  17. 万能查看电脑连接过的WiFi密码
  18. java后台地址(省,市,区)、姓名、手机号算法智能识别
  19. 谷歌浏览器——新建下载任务
  20. Chrome中devtools安装

热门文章

  1. Atitit hadoop使用总结 目录 1.1. 下载300m ,解压后800M 1 1.2. 二:需要的jar包 1 2. Demo code 2 2.1. WCMapper 2 2.2. WC
  2. Atitit 性能指标与性能提升的5个原则与性能提升模型
  3. Atitit.如何建立研发体系
  4. Atitit.报名模块的管理
  5. paip.c++ gui 库HtmLayout 的优缺点 QT优点
  6. 我踩过的支付通道的“坑”(一)
  7. 董承非: 如何从各种类型的错误中学习
  8. 当Python遇上HDF5--性能优化实战
  9. Token九重天——如何设计区块链项目的通证模型
  10. 机器学习笔记(二十二):逻辑回归中使用模型正则化