8.1.6 间歇调用和超时调用
Javascript是单线程语言,但是它允许通过设置超时值和间歇时间值来调度代码在特定的时刻执行。
⑴ 超时值是在指定的时间过后执行代码。
⑵ 间歇时间值是每隔指定的时间就执行一次代码
超时调用需要使用window对象的setTimeout()方法,它接受两个参数:
◆ 要执行的代码
是一个包含Javascript代码的字符串(就和在eval()函数中使用的字符串一样),也可以是一个函数。例:
//不建议传递字符串!因为传递字符串可能导致性能损失
setTimeout("alert('Hello world!')",1000);
//推荐的调用方式
setTimeout(function(){
alert("Hello world");
},1000)
◆ 以毫秒表示的时间
是一个表示等待多长时间的毫秒数,但经过改时间后指定的代码不一定会执行。
setTimeout()的第二个参数告诉Javascript再过多长时间把当前任何添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码执行完了以后再执行。
调用setTimeout()之后,该方法会返回一个数值ID,表示超时调用。这个超时调用ID是计划执行代码的唯一标识符,可以通过它来取消超时调用。要取消尚未执行的超时调用计划,可以调用clearTimeout()方法并将相应的超时调用ID作为参数传递给它。例:
//设置超时调用
var timeoutId = setTimeout(function(){
alert("Hello world!");
},1000);
//注意:把它取消
clearTimeout(timeoutId)
只要在指定的时间尚未过去之前调用clearTimeout(),就可以完全取消超时调用。
超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined
间歇调用与超时调用类似,只不过它会按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。
设置间歇调用的 方法是setInterval(),它接收的参数与setTimeout()相同;要执行的代码(字符串或函数)和每次执行之前需要等待的毫秒数,例:
//不建议传递字符串!
setInterval("alert('Hello world')",10000);
//推荐的调用方式
setInterval(function(){
alert("Hello world")
},10000);
调用setInterval()方法同样也会返回一个间歇调用ID,该ID可用于在将来某个时刻取消间歇调用。
要取消尚未执行的间歇调用,可以使用clearInterval()方法并传入想对应的间歇调用ID。取消间歇调用的重要性要远远高于取消超时调用,,因为在不加干涉的情况下,间歇调用将会一直执行到页面卸载。
例:
var num=0;
var max=10;
var intervalId=null;
function incrementNumber(){
num++ ;
//如果执行次数达到了max设定的值,到取消后续尚未执行的调用
if(num == max){
clearInterval(intervalId);
alert("Done");
}
}
intervalId = setInterval(incrementNumber,500);
也可以使用超时调用来实现,例:
var num=0;
var max=10;
var intervalId=null;
function incrementNumber(){
num++ ;
//如果执行次数达到了max设定的值,则设置另一次超时调用
if(num < max){
setTimeout(incrementNumber,500)
}else{
alert("Done");
}
}
setTimeout(incrementNumber,500);
可见,在使用超时调用时,没有必要跟踪超时调用ID,因为每次执行代码之后,如果不再设置另一次超时调用,调用就会自行停止。
一般认为,使用超时调用来模拟间歇调用的是一种最佳模式
在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。而像前面实例中那样使用超时调用,则完全可以避免这一点。所以最好不要使用间歇调用。