基于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

注意:

  1. setTimeout和setInterval传递了对函数的引用(没有括号)。 代码setTimeout(myfunction(), 500); 将立即运行myfunction()。
  2. 毫秒时间很少是准确的。 它们仅指定在特定时间段后浏览器变为空闲时应运行的功能。
  3. 不要依赖以特定顺序运行的函数,例如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()()吗?

这需要进一步解释。 func.shift()从数组中删除第一项并返回它。 那将是对函数的引用,因此我们添加括号以执行它。

该语句在功能上与var f = func.shift(); f();相同var f = func.shift(); f(); var f = func.shift(); f();

ProcessThread在传递的数组中运行所有函数,但每个函数之间要等待20毫秒。 可以按顺序执行任意数量的函数…假设没有单个函数抛出“无响应脚本”错误。

但是,最耗时的代码可能会处理大量数据。 在我的下一篇文章中,我们将编写更强大的代码来处理这种类型的操作。

From: https://www.sitepoint.com/javascript-timer-pseudo-threading/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值