在之前的那篇浏览器对Javascript代码执行的限制文章中,描述了5个浏览器在javascript代码执行的时间过长的时候怎么办。它不会改变浏览器的行为,也不可能取消掉后端服务器的进程。不过,计时器可以帮助我们实现长期运行的任务而不需要阻塞浏览器。
JavaScript代码中,每一个函数都可以设定在某一个时刻之后执行:
还有两个方法,clearTimeout()和 clearInterval(),可以清除计时器。
var timerID = setTimeout(myfunction,500);
clearTimeout(timerID);
需要注意的是:
定时的代码不会立即执行,这样浏览器在这期间还能做一些别的事情。因此我们也可以将一个长的任务分成好几个部分来执行。
举一个简单的饿例子,加入我们想按照顺序执行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()会移除数组中的第一个元素然后返回这个元素。这里返回的就是个函数,所以我们再用一个括号来执行它。它跟var f = func.shift(); f()是一样的。
ProcessThread会依次运行传递进来的所有函数,但是会相隔20ms。无论多少个函数,都会按次序执行,假设没有哪个程序会跑出”unresponsive script”错误。
当然,这种方法对于处理大型数据的时候会比较有用。
热门源码