当前位置: 首页 > 后端技术 > Node.js

Node.js指南(Node.js中的Timers)

时间:2023-04-03 23:25:19 Node.js

Node.js中的TimersNode.js中的Timers模块包含在一定时间后执行代码的功能,定时器不需要通过require()导入,因为所有方法都可以全局模拟浏览器JavaScriptAPI,所以要充分了解计时器函数何时执行,最好先阅读Node.js事件循环。使用Node.js控制时间连续性Node.jsAPI提供了几种方法来安排代码在当前时间之后的某个时间执行。以下功能可能看起来很熟悉,因为它们在大多数浏览器中都可用。可用,但Node.js实际上提供了自己对这些方法的实现,定时器与系统紧密集成,虽然API与浏览器API类似,但在实现上存在一些差异。Execute"whenIsay"~setTimeout()setTimeout()可以用来安排代码在指定的毫秒数后执行,这个功能类似于浏览器JavaScriptAPI中的window.setTimeout(),但是不能传递一串代码执行。setTimeout()接受一个要执行的函数作为第一个参数,毫秒延迟定义为一个数字作为第二个参数,还可以包含其他参数,并将这些参数传递给函数。这是一个示例:functionmyFunc(arg){console.log(`argwas=>${arg}`);}setTimeout(myFunc,1500,'funky');上述函数myFunc()将尽可能接近1500毫秒(或1.5秒)执行。不能依赖设置的超时间隔在确切的毫秒数之后执行,这是因为其他阻塞或保留在事件循环中的执行代码将延迟超时的执行,唯一保证超时不会早于执行声明的超时间隔。setTimeout()返回一个Timeout对象,该对象可用于引用已设置的超时,此返回的对象可用于取消超时(请参阅下面的clearTimeout())和更改执行行为(请参阅下面的unref())。Execute"afterthis"~setImmediate()setImmediate()将在当前事件循环周期结束时执行代码,这段代码将在当前事件循环中的任何I/O操作和为下一个事件循环安排的任何定时器之后执行before,这段代码执行可以被认为是“恰好在之后”,这意味着在setImmediate()函数调用之后的任何代码都将在setImmediate()函数参数之前执行。setImmediate()的第一个参数将是要执行的函数,任何后续参数将在执行时传递给函数,这是一个示例:console.log('beforeimmediate');setImmediate((arg)=>{console.log(`立即执行:${arg}`);},'soimmediate');console.log('立即后');上面传递给setImmediate()的函数将在所有可运行代码执行后执行,控制台输出将是:beforeimmediateafterimmediateexecutingimmediate:所以immediatesetImmediate()返回一个Immediate对象,可用于取消预定的立即执行(参见clearImmediate()以下)。注意:不要混淆setImmediate()和process.nextTick(),它们有一些主要区别,首先是process.nextTick()将在任何setImmediate之前和任何计划的I/O之前运行,第一个和第二个是process.nextTick()是不可清除的,这意味着一旦代码被安排与process.nextTick()一起执行,它就无法停止,就像使用普通函数一样,请参阅本指南以更好地理解进程。nextTick()的操作。“无限循环”执行~setInterval()如果有一个代码块要执行多次,可以使用setInterval()来执行代码,setInterval()接受一个函数参数,它会是第二个给定的毫秒数delay参数运行无限次,并且像setTimeout()一样,除了延迟之外还可以添加额外的参数并传递给函数调用。与setTimeout()一样,由于事件循环中可能保留的操作,无法保证延迟,因此应将其视为近似延迟,请参见下面的示例:functionintervalFunc(){console.log('Cantstopmenow!');}setInterval(intervalFunc,1500);在上面的示例中,intervalFunc()大约每1500毫秒或1.5秒执行一次,直到它停止(见下文)。与setTimeout()一样,setInterval()也返回一个Timeout对象,可用于引用和修改已设置的时间间隔。清除未来如果需要取消Timeout或Immediate对象,可以做什么?setTimeout()、setImmediate()和setInterval()返回一个定时器对象,可以用来引用设置的Timeout或Immediate对象,通过将该对象传递给相应的清除函数,该对象的执行将完全停止。对应的函数是clearTimeout()、clearImmediate()和clearInterval(),每个函数的例子见下面的例子:consttimeoutObj=setTimeout(()=>{console.log('timeoutbeyondtime');},1500);constimmediateObj=setImmediate(()=>{console.log('立即执行immediate');});constintervalObj=setInterval(()=>{console.log('采访间隔');},500);clearTimeout(timeoutObj);clearImmediate(immediateObj);clearInterval(intervalObj);leavetimeout请记住,setTimeout和setInterval返回Timeout对象,Timeout对象提供了两个函数,旨在使用unref()和ref()来增强超时行为。如果你用set函数调度一个Timeout对象,你可以在对象上调用unref(),这会稍微改变行为,如果是最后执行的代码,Timeout对象将不会被调用,Timeout对象不会保持进程存活状态,等待执行。以类似的方式,调用了unref()的Timeout对象可以通过在同一Timeout对象上调用ref()来消除该行为,然后确保其执行。但是请注意,出于性能原因,这并不能完全恢复原始行为,请参见以下两个示例:consttimerObj=setTimeout(()=>{console.log('willirun?');});//如果单独,此语句将使上述//超时不运行,因为超时将是唯一//阻止程序退出timerObj.unref()的东西;//我们可以通过调用内部的ref()使它恢复生机//立即设置立即(()=>{timerObj.ref();});进一步了解事件循环事件循环和计时器远不止本指南涵盖的内容,了解Node.js事件循环内部结构有关计时器在执行期间如何运行的更多信息,请查看本Node.js指南:Node.js指南。js事件循环、定时器和process.nextTick()。上一篇:不要阻塞事件循环(或工作池)下一篇:HTTP事务剖析