js异步之setTimeout与setInterval
基本介绍
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相关推荐
- JS中的setTimeout和setInterval函数
目录 前言 setTimeout setTimeout()函数应用之点名器 setInterval setInterval应用之重写点名器 前言 在生活中,常有定时做某事,或者循环做某事的需求,如设置 ...
- js基础之setTimeout与setInterval原理分析
setTimeout与setInterval概述 setTimeout与setInterval是JavaScript引擎提供的两个定时器方法,分别用于函数的延时执行和循环调用.前者的主要思想是通过一个 ...
- js中计时器setTimeout、setInterval、requestAnimationFrame区别
转载自:https://www.cnblogs.com/xiaohuochai/p/5777186.html 本文仅用于作为学习笔记 计时器一直是javascript动画的核心技术.而编写动画循环的关 ...
- JS 自定义用setTimeout 实现 setInterval功能
自定义用setTimeout 实现 setInterval功能 // setTimeout(function() {// console.log('定时炸弹') // },1000)// setInt ...
- JS自定义用setTimeout 实现 setInterval功能
自定义用setTimeout 实现 setInterval功能 // setTimeout(function() { // console.log('定时炸弹') // },1000)// setIn ...
- 【JS基础】setTimeout、setInterval、clearTimeout、clearInterval
定时器 JS设置定时器和清除定时器 在做项目中难免会碰到需要实时刷新,动画依次出现等等需求,这时候就需要定时器登上我们的代码舞台了,所以今天我们就先来了解一下JS定时器的设置和清除吧. 一.启用定 ...
- js异步与同步的区别
你应该知道,javascript语言是一门"单线程"的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条 ...
- js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...
javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...
- JavaScript———从setTimeout与setInterval到AJAX异步
setTimeout与setInterval执行 首先我们看一下以下代码打印结果 1 2 3 4 5 6 7 console.log(1); setTimeout(function() { conso ...
- 用故事解析setTimeout和setInterval(内含js单线程和任务队列)
用故事解析setTimeout和setInterval(内含js单线程和任务队列) 区别: setTimeout(fn,t): 延迟调用,超过了时间就调用回调函数,返回一个id,使用clearTime ...
最新文章
- 特殊字符与语义化标签
- mvp关联activity生命周期_Rxjava+Retrofit统一异常处理与生命周期管理
- linux mysql 指令无效_linux下安装mysql,mysql命令失效的原因
- 1.	变量提升 2.	条件语句 3.	循环语句 弹出框的三种形式 If条件的种类...
- html5 formdata api,HTML5 API FormData --- 使用
- python参数类型_Python 参数类型和参数匹配模型
- thinkphp mysql日志_MySQL的日志基础知识及基本操作学习教程
- 90TB显存!英伟达发布新一代SuperPod超算,AI算力新巅峰!
- AlldayTest 产品使用--文件
- python 强类型 弱类型_强类型、弱类型
- python必背入门代码-python必背内容有哪些
- 结构力学求解器_结构力学学好这些内容对施工很关键,你都学懂了吗?
- css3实现浮动元素垂直水平居中
- linux网卡驱动probe函数详解
- 孵出鸡蛋然后拿去卖钱
- JAVA 文件分割工具类
- 万能查看电脑连接过的WiFi密码
- java后台地址(省,市,区)、姓名、手机号算法智能识别
- 谷歌浏览器——新建下载任务
- Chrome中devtools安装
热门文章
- Atitit hadoop使用总结 目录 1.1. 下载300m ,解压后800M	1 1.2. 二:需要的jar包	1 2. Demo code	2 2.1. WCMapper	2 2.2. WC
- Atitit 性能指标与性能提升的5个原则与性能提升模型
- Atitit.如何建立研发体系
- Atitit.报名模块的管理
- paip.c++ gui 库HtmLayout 的优缺点 QT优点
- 我踩过的支付通道的“坑”(一)
- 董承非: 如何从各种类型的错误中学习
- 当Python遇上HDF5--性能优化实战
- Token九重天——如何设计区块链项目的通证模型
- 机器学习笔记(二十二):逻辑回归中使用模型正则化