nodejs里面的Timers

avatarplhDigital nomad

Timers在nodejs以内和以外

Timers模块在nodejs包括函数,执行一些代码,在一系列时间之后。Timers不需要通过require()来引用,因为作为全局变量。为了完全理解,当Timers函数将被执行,这是一个好主意来读取,在ndoejs时间循环。

控制nodejs控制事件连续

nodejsAPI提供一系列计划代码来执行一些观点,在某个时刻执行。这个函数可能看起来很熟悉,直到他们大多数浏览器都能用。但是nodejs实际上提供他们自己履行下面几个方法。Timers整合关键系统,并且尽管这个事实,API镜像浏览器API,这里有一些不同的实现方式

什么时候说? 执行 setTimeout()

setTimeout()能被使用计划代码执行在一个特定毫秒。这个函数相似于window,setTimeout(),来自于浏览器jsAPI,然而一个字符串代码不能通过来执行。 setTimeout()接受第一个参数作为函数来执行。第二个参数作为毫秒来延迟。另外参数能够被包括,并且这些将会传递通过函数的形式。这是一个例子

function myFunc(arg) {
  console.log(`arg was => ${arg}`);
}
setTimeout(myFunc, 1500, 'funky');

上面这个函数myFunc()将会被执行在接近1500ms之后, 这个超时间隔,是一个设置成在一定间隔事件后执行。这是因为其他阻止或保留在事件循环中的执行代码会将超时执行推回。唯一的保证是超时将不会比声明的超时间间隔更早执行。 setTimeout()返回一个Timeout对象,这个能被用来参照超时。这个返回的对象能被用来取消超时,例如clearTimeout()

“Right after this”执行setImmediate()

setImmediate()将会执行代码在最后,当前事件循环,将会被执行在I/O操作之后。并且在所有顶实际被计划在下个事件循环。这个代码执行能够相称作为即可执行。意味着所有的代码在setImmediate()之后的函数调用将被执行在他之前。 第一个参数是一个函数,setImmediate()将会是函数被执行,所有随后的参数将会被传递给函数,当他被执行,下面是一个例子:

console.log('before immediate');

setImmediate((arg)=>{
  console.log(`executing immediate: ${arg}`)
},'so immediate');
console.log('after immediate');

上面函数传递setImmediate()将会执行在所有可运行代码。并且打印输出会如下所示:

before immediate
after immediate
executing immediate: so immediate

setImmediate()返回一个Immediate对象,这个能被用作取消计划执行。就是说,这个返回的东西能够取消定时器。 注意:不要得到setImmediate()拒绝,通过process.nextTick().这里有一些主要的方式,他们的不同。这第一个是process.nextTick()将会运行在所有Immediate,所以它被同时设置成所有I/O。这个时刻,是process.nextTick(),这个解释不能停止,就像函数内。参照前面的导航来更好的明白process.nextTick()操作。

无限循环解释器setInterval()

如果这里有一个阻塞的代码,它应该执行多次的事件,setInterval()能够被用来执行这些代码。setInterval()运行函数参数,能运行无数次,就像setTimeout运行的函数调用自己一样。他的延迟无法保障,就像setTimeout那样,因为操作,取决于事件循环,因此应该将他当作事件循环来对待,看下面的例子:

function intervalFunc() {
  console.log('Cant stop me now!');
}
setInterval(intervalFunc, 1500);

在上面的例子,每隔1.5秒执行一次。 返回的对象能被用来重置。

清理未来。

如何停止定时器。用他们返回的对象可以重置。看如下例子:

const timeoutObj = setTimeout(() => {
  console.log('timeout beyond time');
}, 1500);

const immediateObj = setImmediate(() => {
  console.log('immediately executing immediate');
});

const intervalObj = setInterval(() => {
  console.log('interviewing the interval');
}, 500);

clearTimeout(timeoutObj);
clearImmediate(immediateObj);
clearInterval(intervalObj);

离开超时之前

记住,定时器对象通过i哦setTimeout()setInterval返回.这个定时器对象提供两个函数,只在用unref()ref()来增强超时行为。如果这里有一个Timeout对象计划用一个set函数,unref()能被调用在一个对象。这将会轻微的改变行为,并且不调用Timeout对象,如果他是最后一个代码来执行。这个定时器对象将不会继续保持进程活动状态,等待执行。 这是一个相似的时尚,一个定时器对象,他有unref()被调用,他能移除,行为,被ref()调用的行为,在相同的定时器对象,这个将会确保他的执行。意识到,然而,这是不确切,这个初始行为性能理由的。看下面这个代码。

const timerObj = setTimeout(() => {
  console.log('will i run?');
});
// 如果左边独立,这个声明将保留在上面的超时来运行。知道超时将会是唯一的事情来确保程序退出
timerObj.unref();
// 我们也可以给他回复原状通过ref来给,ref写在immediate里面
setImmediate(() => {
  timerObj.ref();
});

进一步深入事件循环

这里有更多对于事件循环和定时器,比我们的导航更多的。为了学习他们学习nodejs内部事件循环,以及定时器如何执行的。去阅读The Node.js Event Loop, Timers, and process.nextTick().