setTimeout初探(二):零延迟的定时任务
来源:互联网 发布:sql dense rank 编辑:程序博客网 时间:2024/06/05 23:50
按照任务队列的执行机制,定时任务只有在主线程执行完成后才会执行,如下:
var counter = 1;// 添加定时到任务队列中,只有在主线程的末尾才会执行setTimeout(function() { counter ++;}, 0);// 无论操作多少次,无论在什么样的浏览器环境下,必定输出false// 即使此段代码之前还有长时间的运算任务,因为主线程还未执行完成,也必定输出falsealert(counter > 1);
在很多情况下,这会对我们的程序造成困扰,例如不能满足顺序执行的操作逻辑,或者视图刷新跟不上,出现跳帧现象,一般的改进方法是将setTimeout的方法抽取出来,强制执行一次,如下:
var counter = 1;// 添加定时到任务队列中,只有在主线程的末尾才会执行var task = function() { counter ++;};setTimeout(task, 0);// 强行调用任务函数task();// 现在输出一定是truealert(counter > 1);
在d3中,用d3.timeout替换默认的timeout函数,能轻松解决此等烦恼,示例代码如下:
var counter = 1;// 添加定时到任务队列中,只有在主线程的末尾才会执行d3.timeout(function() { counter ++;}, 0);// 强制执行时间任务的回调函数,对d3.timer、d3.interval也有效d3.timerFlush()// 现在输出一定是truealert(counter > 1);
按照浏览器JS执行引擎的单线程设计,真正的零延迟定时任务当然不可能,但是可以通过巧妙的设计改变时间函数的执行顺序,达到零延迟定时任务的执行效果。
0 0
- setTimeout初探(二):零延迟的定时任务
- 定时延迟任务
- 延迟与定时任务
- AlarmManager定时任务延迟执行
- 系统延迟及定时任务
- linux-系统延迟定时任务与find命令的使用
- 初探Spring中的定时任务
- js 定时监听setInterval方法、延迟执行setTimeout方法
- js中的延迟执行setTimeout和定时执行setInterval
- 关于定时任务的一点思考(二)
- 定时任务schedule的二种用法
- 关于setTimeout进行参数传递时定时任务失效的解决办法
- beego任务定时执行,延迟执行
- linux初学者-延迟及定时任务篇
- linux定时任务二
- 定时任务发展史(二)
- JavaScript延迟函数的学习--setTimeout--clearTimeout
- setTimeout处理jquery事件的延迟响应
- Linux-(C)IO多路复用之select学习(转载)
- mysql like模糊查询like %someTitle%效率低下
- JDBC-二进制文件的存储与读取
- 【leetcode】36. Valid Sudoku
- PCB设计经验:布局基本要领
- setTimeout初探(二):零延迟的定时任务
- 关于字符数组与字符串指针的区分
- 61%的美国民众担心自己的私家车以及家庭安保摄像探头会遭到黑客攻击
- java.io.EOFException: Unexpected end of ZLIB input stream异常处理
- Android手机抓包教程
- CentOS卸载OpenJDK并安装Sun JDK
- Git中Read.MD文件格式:Markdown语言详解
- cocos2dx学习之路----第十一篇(对声音的操作处理)
- 排序算法 之 选择排序SelectionSort