javascript 线程
在我以前的文章《 JavaScript执行和浏览器限制》中 ,我描述了排名前5位的浏览器如何确定JavaScript代码何时运行太长时间并引发“无响应脚本”错误。 更改浏览器的行为是不切实际的,并且可能不总是能够将处理任务卸载到服务器。 幸运的是,计时器可以帮助我们执行长时间运行的任务,而无需锁定浏览器。
什么是计时器?
可以将JavaScript代码(例如单个函数)设置为在特定时间段后运行:
- setTimeout(function,msec [,arg1…argN])
经过毫秒毫秒后运行命名函数。 参数(如果有)将传递给该函数。 - setInterval(function,msec [,arg1…argN])
与setTimeout相似,不同之处是该函数每毫秒毫秒无限次调用一次。
其他两个函数clearTimeout()
和clearInterval()
将取消计时器操作,例如
var timerID = setTimeout(myfunction, 500);
clearTimeout(timerID); // myfunction() will never be called
注意:
- setTimeout和setInterval传递了对函数的引用(没有括号)。 代码
setTimeout(myfunction(), 500);
将立即运行myfunction()。 - 毫秒的时间很少是准确的。 它们仅指定在特定时间段后浏览器变为空闲时应运行的功能。
- 不要依赖以特定顺序运行的函数,例如
setTimeout(f1, 50); setTimeout(f2, 50);
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()从数组中删除第一项并返回它。 那将是对函数的引用,因此我们添加括号以执行它。
该语句在功能上与var f = func.shift(); f();
相同var f = func.shift(); f();
var f = func.shift(); f();
ProcessThread在传递的数组中运行所有函数,但每个函数之间要等待20毫秒。 可以按顺序执行任意数量的函数……假设没有单个函数抛出“无响应脚本”错误。
但是,最耗时的代码可能会处理大量数据。 在我的下一篇文章中,我们将编写更强大的代码来处理这种类型的操作。
翻译自: https://www.sitepoint.com/javascript-timer-pseudo-threading/
javascript 线程