2.12 Timer
定时器相关的API在JavaScript中已经存在了很长时间,Node中的定时器都是全局方法,无须通过require来引入。
2.12.1 常用API
JavaScript中常用的timer方法有两个,分别是setTimeout和setInterval,在Node中,setTimeout和setInterval属于Timeout类,调用对应的方法后都会返回相应的对象。
除了这两个方法之外,Node还提出了新的setImmediate方法,该方法已经在第1章详细介绍过了,这里省略相关的内容。
1.setTimeout
一个使用setTimeout方法最简单的例子是延迟一个函数的执行时间,下面的例子中,将会在1秒后打印出Hello。
如果想要在回调执行前清除定时器,可以使用clearTimeout方法:
2.setInterval
如果想要以一个固定的时间间隔运行回调函数,可以使用setInterval方法,使用方式和setTimeout相同,对上面的代码进行修改:
运行后会以1秒为间隔输出Hello,同样的,可以用clearInterval方法来清除定时器:
3.回调函数的参数
在前面定义的定时器中,第一个参数是回调方法,第二个参数是定时器的超时时间,其后面还可以定义更多的参数,多余的参数会被作为回调函数的参数。
2.12.2 定时器中的this
在JavaScript中,setTimeout和setInterval中的this均指向Windows。原因也很简单,定时器方法的第一个参数是一个匿名函数,而JavaScript中所有匿名函数的this都指向Windows。
代码2.39 前端JavaScript定时器中的this
在Node中,setTimeout和setInterval的this会指向timeout类,前面也曾提到,该类在setTimeout和setInterval内部创建并返回,开发者通常不会直接用到两个类,但是可以将其打印出来。
代码2.40 Node定时器中的this
如果在setTimeout方法内部涉及了this的指向问题,通常会使用bind或者call方法来重新绑定this,我们在第3章还会讨论这个问题。