JavaScript基于计时器的伪线程机制
2011-06-15 18:00
106 查看
摘要:在之前的那篇浏览器对Javascript代码执行的限制文章中,描述了5个浏览器在javascript代码执行的时间过长的时候怎么办。它不会改变浏览器的行为,也不可能取消掉后端服务器的进程。不过,计时器可以帮助我们实现长期运行的任务而不需要阻塞浏览器。
在之前的那篇浏览器对Javascript代码执行的限制文章中,描述了5个浏览器在javascript代码执行的时间过长的时候怎么办。它不会改变浏览器的行为,也不可能取消掉后端服务器的进程。不过,计时器可以帮助我们实现长期运行的任务而不需要阻塞浏览器。
setTimeout(function,msec[,arg1...argN]),会在多少毫秒之后运行这个函数。后面的参数会传递给要执行的函数。
setInterval(function,msec[,arg1...argN]),与setTimeout类似,只不过是每这么多毫秒执行一次。
还有两个方法,clearTimeout()和 clearInterval(),可以清除计时器。
需要注意的是:
setTimeout和setInteral会给函数传递一个引用。setTimeout(myfunction(),500)这样的代码会立即执行这个函数。
毫秒数不会那么的精确。他只会在浏览器进程空闲的时候才会比较准确的按时间执行。
不要过于依赖这样的执行顺序:setTimeout(f1,50),setTimeout(f2,50),有可能f2()会先执行。
举一个简单的饿例子,加入我们想按照顺序执行f1(),f2(),f3():
ProcessThread会依次运行传递进来的所有函数,但是会相隔20ms。无论多少个函数,都会按次序执行,假设没有哪个程序会跑出”unresponsive script”错误。
当然,这种方法对于处理大型数据的时候会比较有用。
在之前的那篇浏览器对Javascript代码执行的限制文章中,描述了5个浏览器在javascript代码执行的时间过长的时候怎么办。它不会改变浏览器的行为,也不可能取消掉后端服务器的进程。不过,计时器可以帮助我们实现长期运行的任务而不需要阻塞浏览器。
什么是计时器
JavaScript代码中,每一个函数都可以设定在某一个时刻之后执行:setTimeout(function,msec[,arg1...argN]),会在多少毫秒之后运行这个函数。后面的参数会传递给要执行的函数。
setInterval(function,msec[,arg1...argN]),与setTimeout类似,只不过是每这么多毫秒执行一次。
还有两个方法,clearTimeout()和 clearInterval(),可以清除计时器。
var timerID = setTimeout(myfunction,500); clearTimeout(timerID);
需要注意的是:
setTimeout和setInteral会给函数传递一个引用。setTimeout(myfunction(),500)这样的代码会立即执行这个函数。
毫秒数不会那么的精确。他只会在浏览器进程空闲的时候才会比较准确的按时间执行。
不要过于依赖这样的执行顺序:setTimeout(f1,50),setTimeout(f2,50),有可能f2()会先执行。
基于计时器的执行
定时的代码不会立即执行,这样浏览器在这期间还能做一些别的事情。因此我们也可以将一个长的任务分成好几个部分来执行。举一个简单的饿例子,加入我们想按照顺序执行f1(),f2(),f3():
function ProcessThread(func) { var ms = 20; setTimeout(function() { func.shift()(); if (func) { setTimeout(arguments.callee, ms); } }, ms); } ProcessThread([f1, f2, f3]);
func.shift()()是什么?
这里需要解释一下:func.shift()会移除数组中的第一个元素然后返回这个元素。这里返回的就是个函数,所以我们再用一个括号来执行它。它跟var f = func.shift(); f()是一样的。ProcessThread会依次运行传递进来的所有函数,但是会相隔20ms。无论多少个函数,都会按次序执行,假设没有哪个程序会跑出”unresponsive script”错误。
当然,这种方法对于处理大型数据的时候会比较有用。
相关文章推荐
- [Andriod]计时器实现-基于线程消息机制三种方式
- 基于JavaScript实现继承机制之原型链(prototype chaining)的详解
- silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
- day15 CSS 定位 JavaScript 基本语法、基于对象编程、事件处理机制
- java实现面向对象和javaScript基于对象的区别&java垃圾回收机制和其他编程语言的比较
- 基于JavaScript实现继承机制之原型链(prototype chaining)的详解
- 基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
- Netty之基于EventLoop机制的高效线程模型
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- JavaScript线程机制
- 基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
- 轻松学习JavaScript十三:JavaScript基于面向对象之继承(包含面向对象继承机制)
- Javascript:再论Javascript的单线程机制 之 DOM渲染时机
- Netty精粹之基于EventLoop机制的高效线程模型
- javascript的单线程异步机制探究
- JavaScript的单线程执行及其异步机制矛盾否?
- 基于JavaScript实现继承机制之调用call()与apply()的方法详解
- 基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
- JavaScript基于面向对象之继承机制
- 基于JavaScript实现继承机制之原型链(prototype chaining)的详解