位置: 编程技术 - 正文

Node.js中使用计时器定时执行函数详解(node-js)

编辑:rootadmin

推荐整理分享Node.js中使用计时器定时执行函数详解(node-js),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node.js详解,nodejs 科学计算,node.js的使用场景,node.js使用教程,node-js,node-js,node.js的使用,node.js使用教程,内容如对您有帮助,希望把文章链接给更多的朋友!

如果你熟悉客户端JavaScript编程,你可能使用过setTimeout和setInterval函数,这两个函数允许延时一段时间再运行函数。比如下面的代码, 一旦被加载到Web页面,1秒后会在页面文档后追加“Hello there”:

而setInterval允许以指定的时间间隔重复执行函数。如果把下面的代码注入到Web页面,会导致每秒钟向页面文档后面追加一句“Hello there”:

因为Web早已成为一个用来构建应用程序的平台,而不再是简单的静态页面,所以这种类似的需求日益浮现。这些任务计划函数帮助开发人员实现表单定期验证,延迟远程数据同步,或者那些需要延时反应的UI交互。Node也完整实现了这些方法。在服务器端,你可以用它们来重复或延迟执行很多任务,比如缓存过期,连接池清理,会话过期,轮询等等。

使用setTimeout延迟函数执行

setTimeout可以制定一个在将来某个时间把指定函数运行一次的执行计划,比如:

和客户端JavaScript完全一样,setTimeout接受两个参数,第一个参数是需要被延迟的函数,第二个参数是延迟时间(以毫秒为单位)。

setTimeout返回一个超时句柄,它是个内部对象,可以用它作为参数调用clearTimeout来取消计时器,除此之外这个句柄没有任何作用。

使用clearTimeout取消执行计划

一旦获得了超时句柄,就可以用clearTimeout来取消函数执行计划,像这样:

这个例子里,计时器永远不会被触发,也不会输出”time out!”这几个字。你也可以在将来的任何时间取消执行计划,就像下面的例子:

代码指定了两个延时执行的函数A和B,函数A计划在2秒钟后执行,B计划在1秒钟后执行,因为函数B先执行,而它取消了A的执行计划,因此A永远不会运行。

制定和取消函数的重复执行计划

setInterval和setTimeout类似,但是它会以指定时间为间隔重复执行一个函数。你可以用它来周期性的触发一段程序,来完成一些类似清理,收集,日志,获取数据,轮询等其它需要重复执行的任务。

下面代码每秒会向控制台输出一句“tick”:

如果你不想让它永远运行下去,可以用clearInterval()取消定时器。

setInterval返回一个执行计划句柄,可以把它用作clearInterval的参数来取消执行计划:

使用process.nextTick将函数执行延迟到事件循环的下一轮

有时候客户端JavaScript程序员用setTimeout(callback,0)将任务延迟一段很短的时间,第二个参数是0毫秒,它告诉JavaScript运行时,当所有挂起的事件处理完毕后立刻执行这个回调函数。有时候这种技术被用来延迟执行一些并不需要被立刻执行的操作。比如,有时候需要在用户事件处理完毕后再开始播放动画或者做一些其它的计算。

Node中,就像 “事件循环”的字面意思,事件循环运行在一个处理事件队列的循环里,事件循环工作过程中的每一轮就称为一个tick。

你可以在事件循环每次开始下一轮(下一个tick)执行时调用回调函数一次,这也正是process.nextTick的原理,而setTimeout,setTimeout使用JavaScript运行时内部的执行队列,而不是使用事件循环。

Node.js中使用计时器定时执行函数详解(node-js)

通过使用process.nextTick(callback) ,而不是setTimeout(callback, 0),你的回调函数会在队列内的事件处理完毕后立刻执行,它要比JavaScript的超时队列快很多(以CPU时间来衡量)。

你可以像下面这样,把函数延迟到下一轮事件循环再运行:

注意:process对象是Node为数不多的全局对象之一。

堵塞事件循环

Node和JavaScript的运行时采用的是单线程事件循环,每次循环,运行时通过调用相关回调函数来处理队列内的下个事件。当事件执行完毕,事件循环取得执行结果并处理下个事件,如此反复,直到事件队列为空。如果其中一个回调函数运行时占用了很长时间,事件循环在那期间就不能处理其它挂起的事件,这会让应用程序或服务变得非常慢。

在处理事件时,如果使用了内存敏感或者处理器敏感的函数,会导致事件循环变得缓慢,而且造成大量事件堆积,不能被及时处理,甚至堵塞队列。

看下面堵塞事件循环的例子:

这个例子里,nextTick2和timeout函数无论等待多久都没机会运行,因为事件循环被nextTick函数里的无限循环堵塞了,即使timeout函数被计划在1秒钟后执行它也不会运行。

当使用setTimeout时,回调函数会被添加到执行计划队列,而在这个例子里它们甚至不会被添加到队列。这虽然是个极端例子,但是你可以看到,运行一个处理器敏感的任务时可能会堵塞或者拖慢事件循环。

退出事件循环

使用process.nextTick,可以把一个非关键性的任务推迟到事件循环的下一轮(tick)再执行,这样可以释放事件循环,让它可以继续执行其它挂起的事件。

看下面例子,如果你打算删除一个临时文件,但是又不想让data事件的回调函数等待这个IO操作,你可以这样延迟它:

使用setTimeout替代setInterval来确保函数执行的串行性

假设,你打算设计一个叫my_async_function的函数,它可以做某些I/O操作(比如解析日志文件)的函数,并打算让它周期性执行,你可以用setInterval这样实现它:

你必须能确保这些函数不会被同时执行,但是如果使用setinterval你无法保证这一点,假如my_async_function函数运行的时间比interval变量多了一毫秒,它们就会被同时执行,而不是按次序串行执行。

译者注:(下面粗体部分为译者添加,非原书内容)

为了方便理解这部分内容,可以修改下作者的代码,让它可以实际运行:

运行下这段代码看看,你会发现,等待5秒钟后,“hello ”被每隔1秒输出一次。而我们期望是,当前my_async_function执行完毕(耗费5秒)后,等待1秒再执行下一个my_async_function,每次输出之间应该间隔6秒才对。造成这种结果,是因为my_async_function不是串行执行的,而是多个在同时运行。

因此,你需要一种办法来强制使一个my_async_function执行结束到下个my_async_function开始执行之间的间隔时间正好是interval变量指定的时间。你可以这样做:

前面代码里,声明了一个叫schedule的函数(第3行),并且在声明后立刻调用它(第行),schedule函数会在1秒(由interval指定)后运行do_it函数。1秒钟过后,第5行的my_async_function函数会被调用,当它执行完毕后,会调用它自己的那个匿名回调函数(第6行),而这个匿名回调函数又会再次重置do_it的执行计划,让它1秒钟后重新执行,这样代码就开始串行地不断循环执行了。

小结

可以用setTimeout()函数预先设定函数的执行计划,并用clearTimeout()函数取消它。还可以用setInterval()周期性的重复执行某个函数,相应的,可以使用clearInterval()取消这个重复执行计划。

如果因为使用了一个处理器敏感的操作而堵塞了事件循环,那些原计划应该被执行的函数将会被延迟,甚至永远无法执行。所以不要在事件循环内使用CPU敏感的操作。还有,你可以使用process.nextTick()把函数的执行延迟到事件循环的下一轮。

I/O和setInterval()一起使用时,你无法保证在任何时间点只有一个挂起的调用,但是,你可以使用递归函数和setTimeout()函数来回避这个棘手的问题。

Node.js中使用事件发射器模式实现事件绑定详解 在Node里,很多对象都会发射事件。比如,一个TCP服务器,每当有客户端请求连接就会发射connect事件,又比如,每当读取一整块数据,文件系统就会发

Node.js模块加载详解 JavaScript是世界上使用频率最高的编程语言之一,它是Web世界的通用语言,被所有浏览器所使用。JavaScript的诞生要追溯到Netscape那个时代,它的核心内容

Node.js中创建和管理外部进程详解 Node被设计用来高效的处理I/O操作,但是你应该知道,有些类型的程序并不适合这种模式。比如,如果你打算用Node处理一个CPU密集的任务,你可能会堵塞

标签: node-js

本文链接地址:https://www.jiuchutong.com/biancheng/370851.html 转载请保留说明!

上一篇:Node.js入门教程:在windows和Linux上安装配置Node.js图文教程(nodejs实战教程)

下一篇:Node.js中使用事件发射器模式实现事件绑定详解(nodejs示例)

  • 办理出口退税时间要求
  • 小规模要交增值税怎么计提
  • 个税里的工资薪金
  • 最新个人所得税扣除标准表
  • 支付租金对方公司提供发票如何入账
  • 项目部电缆属于固定资产吗
  • 公司被扣货款怎么记账
  • 投资款返还案例
  • 企业计提的资产包括哪些
  • 个人投资者取得现金红利的过程不用支付利息税
  • 注销了出口退税怎么办
  • 招标代理资质办理好办吗
  • 发放取暖补贴文件
  • 垫付被骗客服承诺退款
  • 公司茶水间备的零食该计入什么会计科目核算?
  • 开给天猫的服务费分录如何做
  • 代交社保费会计账务处理
  • 企业注销时有未抵扣的留抵
  • 税收编码选错了,发票已经开出去几个月了,还有影响吗
  • 关于330技术维护费
  • 公司主要业务介绍
  • 小规模9万是含税吗
  • 残疾人保障金中上年在职职工人数怎么计算
  • 商场收取商户违约金上什么税?
  • 收回税款 会计分录
  • 土地使用权出让金收费标准
  • 应收款项包括哪些内容,各自有何特点?
  • 增值税普票可以抵扣税吗
  • 工会残保金必须缴纳吗
  • 预付卡发给员工如何入账
  • 自建商品房转为自用增值税
  • 本年利润和未分配利润怎么结转
  • 无法设置系统更新的原因
  • 审核原始凭证应注意
  • 盈余公积转增资本对会计要素的影响
  • 医院装修设计费用取费标准表
  • 三联专用发票每一联分别给谁
  • thinkphp log
  • 购入支票号码和使用支票号码是什么
  • 外币存款利息税
  • java同步操作
  • 印花税实收资本和资本公积
  • 网上免费学电脑
  • 费用发票先入账吗
  • 管理费用的借贷科目
  • 银行利息怎么算10万块三年多少利息
  • 转让土地如何做会计分录
  • 开办费的最新账务处理会计视野
  • 专利技术转让损失会计分录
  • 试分析营改增的重大意义
  • 健身器材折旧年限及计提办法
  • 当月发票是否需要当月支付
  • 产品销售收入的确认条件
  • 记账凭证的基本要素包括
  • 试算平衡表的编制方法
  • win7安装windows无法安装所需的文件请确保
  • win10移动版官网
  • Win10 Mobile/WP8.1优秀专业摄影应用OneShot本周再次更新:修复Bug和优化性能
  • centos7误删除怎么恢复
  • centos基本操作命令
  • pcc是什么文件
  • win7重新安装windows
  • win8的ie浏览器
  • Win10 Mobile Redstone新功能介绍
  • cocos2dx-js
  • dos批处理命令大全
  • qt::windowtype
  • js区分浏览器页面大小
  • linux中tar命令
  • ssh,scp自动登陆的实现方法
  • javascript 操作css
  • android之handler
  • Android系统启动负载均衡
  • android下载图片并保存到本地
  • 山西省地方税务局 先进 文明 李家庄税务所
  • 江苏国税电子税局
  • 深圳市国家税务局赵雨婷
  • 广西电子税务局电话人工客服电话
  • 跨境电商出口商品结构
  • 地税局网上报税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设