Node.js 指南(Node.js中的定时器)

Node.js中的定时器

Node.js中的Timers模块包含在一段时刻后实行代码的函数,定时器不须要经由过程require()导入,因为一切要领都能够在全局范围内模仿浏览器JavaScript API,要完整相识什么时刻实行定时器功用,最好先浏览Node.js事宜轮回

用Node.js掌握时刻连续性

Node.js API供应了几种调理代码的要领,以便在当前时刻以后的某个时刻实行,下面的函数能够看起来很熟悉,因为它们在大多数浏览器中都可用,但Node.js实际上供应了这些要领的本身的完成,定时器与体系严密集成,只管API镜像了浏览器API,但完成方面存在一些差别。

“我说的时刻”实行 ~ setTimeout()

setTimeout()可用于在指定的毫秒数后调理代码实行,此函数相似于浏览器JavaScript API中的window.setTimeout(),然则没法通报一串代码来实行。

setTimeout()接收一个函数作为第一个参数实行,毫秒耽误定义为一个数字作为第二个参数,还能够包含其他参数,并将这些参数通报给函数,这是一个例子:

function myFunc(arg) {
  console.log(`arg was => ${arg}`);
}

setTimeout(myFunc, 1500, 'funky');

因为挪用了setTimeout(),上面的函数myFunc()将尽能够靠近1500毫秒(或1.5秒)实行。

设置的超时刻隔不能依赖于在该准确的毫秒数以后实行,这是因为壅塞或保留在事宜轮回上的其他实行代码将推延实行超时,唯一的保证是超时不会比声明的超时刻隔更早实行。

setTimeout()返回一个Timeout对象,该对象可用于援用已设置的超时,此返回的对象可用于作废超时(请参阅下面的clearTimeout())以及变动实行行动(请参阅下面的unref())。

“在此以后”实行 ~ setImmediate()

setImmediate()将在当前事宜轮回周期结束时实行代码,此代码将在当前事宜轮回中的任何I/O操纵以后以及为下一个事宜轮回调理的任何计时器之前实行,这个代码实行能够被认为是“恰好在此以后”,这意味着setImmediate()函数挪用以后的任何代码都将在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对象,可用于作废已调理的immediate(请参阅下面的clearImmediate())。

注重:不要殽杂setImmediate()process.nextTick(),它们有一些重要的不同之处,第一个是process.nextTick()将在任何设置的Immediate之前以及任何调理的I/O之前运转,第二个是process.nextTick()是不可消灭的,意义是一旦代码被部署用process.nextTick()实行,就没法住手实行,就像运用一般函数一样,请参阅本指南以更好地明白process.nextTick()的操纵。

“无穷轮回”实行 ~ setInterval()

假如存在应当屡次实行的代码块,则能够运用setInterval()来实行该代码,setInterval()接收一个函数参数,它将以给定的毫秒耽误作为第二个参数运转无穷次,就像setTimeout()一样,能够在耽误以外增加其他参数,并将这些参数通报给函数挪用。也像setTimeout()一样,因为能够保留在事宜轮回上的操纵,因而没法保证耽误,因而应将其视为近似耽误,见下面的例子:

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

setInterval(intervalFunc, 1500);

在上面的例子中,intervalFunc()约莫每1500毫秒或1.5秒实行一次,直到它被住手为止(见下文)。

setTimeout()一样,setInterval()也返回一个Timeout对象,该对象可用于援用和修正已设置的距离。

消灭将来

假如须要作废TimeoutImmediate对象,能够做些什么?setTimeout()setImmediate()setInterval()返回一个可用于援用设置TimeoutImmediate对象的计时器对象,经由过程将所述对象通报到响应的clear函数,将完整住手该对象的实行。响应的函数是clearTimeout()clearImmediate()clearInterval(),请参阅下面的示例,相识每一个示例:

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);

留下超时

请记着,setTimeoutsetInterval返回Timeout对象,Timeout对象供应了两个函数,旨在运用unref()ref()来加强Timeout行动。假如运用set函数调理Timeout对象,则能够在该对象上挪用unref(),这将轻微转变行动,假如它是要实行的末了一个代码,则不会挪用Timeout对象,Timeout对象不会使历程坚持运动状况,守候实行。

以相似的体式格局,挪用了unref()Timeout对象能够经由过程在同一个Timeout对象上挪用ref()来删除该行动,然后确保其实行。但请注重,出于机能缘由,这并不能完整恢复初始行动,请参阅以下两个示例:

const timerObj = setTimeout(() => {
  console.log('will i run?');
});

// if left alone, this statement will keep the above
// timeout from running, since the timeout will be the only
// thing keeping the program from exiting
timerObj.unref();

// we can bring it back to life by calling ref() inside
// an immediate
setImmediate(() => {
  timerObj.ref();
});

进一步相识事宜轮回

事宜轮回和计时器比本指南所涵盖的要多得多,要相识有关Node.js事宜轮回内部以及计时器在实行时期怎样操纵的更多信息,请检察此Node.js指南:Node.js事宜轮回、定时器和process.nextTick()

上一篇:不要壅塞事宜轮回(或事情池)

下一篇:HTTP事件的理会

    原文作者:博弈
    原文地址: https://segmentfault.com/a/1190000017460939
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞