在 Node.js 中设置计时器

Posted

技术标签:

【中文标题】在 Node.js 中设置计时器【英文标题】:Setting a timer in Node.js 【发布时间】:2013-01-29 21:16:57 【问题描述】:

我需要每 24 小时在 Node.js 中运行一次代码。我遇到了一个名为setTimeout 的函数。下面是我的代码sn-p

var et = require('elementtree');
var XML = et.XML;
var ElementTree = et.ElementTree;
var element = et.Element;
var subElement = et.SubElement;
var data='<?xml version="1.0"?><entries><entry><TenantId>12345</TenantId><ServiceName>MaaS</ServiceName><ResourceID>enAAAA</ResourceID><UsageID>550e8400-e29b-41d4-a716-446655440000</UsageID><EventType>create</EventType><category term="monitoring.entity.create"/><DataCenter>global</DataCenter><Region>global</Region><StartTime>Sun Apr 29 2012 16:37:32 GMT-0700 (PDT)</StartTime><ResourceName>entity</ResourceName></entry><entry><TenantId>44445</TenantId><ServiceName>MaaS</ServiceName><ResourceID>enAAAA</ResourceID><UsageID>550e8400-e29b-41d4-a716-fffffffff000</UsageID><EventType>update</EventType><category term="monitoring.entity.update"/><DataCenter>global</DataCenter><Region>global</Region><StartTime>Sun Apr 29 2012 16:40:32 GMT-0700 (PDT)</StartTime><ResourceName>entity</ResourceName></entry></entries>'
etree = et.parse(data);
var t = process.hrtime();
// [ 1800216, 927643717 ]

setTimeout(function () 
  t = process.hrtime(t);
  // [ 1, 6962306 ]
  console.log(etree.findall('./entry/TenantId').length); // 2
  console.log('benchmark took %d seconds and %d nanoseconds', t[0], t[1]);
  //benchmark took 1 seconds and 6962306 nanoseconds
,1000);

我想每小时运行一次上述代码并解析数据。作为参考,我使用一秒作为计时器值。任何想法如何进行都会很有帮助。

【问题讨论】:

不是这样...您想每小时运行一次整个脚本,而不是指望节点进程始终处于活动状态。如果你在 linux 中查找 cron 作业。 @cwolves 我在 Windows 7 中,知道如何处理吗?? 如果您使用的不是与 linux 兼容的操作系统,那么请使用另一个执行相同操作的程序。 Windows Task Scheduler seems to be a popular answer. 我也同意@cwolves 的观点,因为你的 node.js 程序可能没有必要一直运行。这只是您系统中运行的另一个进程,这似乎没有必要。 cron 的想法是,它是一个管理器,用于按计划运行可能的许多脚本或作业,同时仅使用运行计划在当时运行的内容所需的系统资源。 TaskTimer - github.com/onury/tasktimer 【参考方案1】:

基本上有三种方法可以去

    setInterval()

setTimeout(f, n) 函数等待 n 毫秒并调用函数 fsetInterval(f, n) 函数每n 毫秒调用一次f

setInterval(function()
  console.log('test');
, 60 * 60 * 1000);      

这会每小时打印一次test。您可以将您的代码(除了 require 语句)放入setInterval()。然而,这对我来说似乎有点丑陋。我宁愿去:

    计划任务 大多数操作系统都有调度任务的方法。在 Windows 上,这称为“Scheduled Tasks”,在 Linux 上查找 cron。

    Use a libary 我在回答时意识到,甚至可以将其视为该问题的重复。

【讨论】:

setInterval 有错别字 Node.js 被安排在毫秒级别,建议您应该使用这些策略在 javascript 中将事情安排到很远的未来似乎是一个糟糕的建议。有很多事情会以意想不到的方式改变时间,让计算机进入睡眠/休眠状态等等。就像其他人建议的那样,在这种情况下,您应该将长期计划委托给基于 Microsoft 的系统程序。

以上是关于在 Node.js 中设置计时器的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中设置计时器?

在javascript中设置计时器

如何在 Ogre 3D 中设置计时器?

我们可以在 -applicationWillTerminate 方法中设置一个计时器吗?

Firestore 限制每小时或每天的读写次数,以防止用户在检查器中设置计时器

求大神!!如何在MFC中设置一个计时器?