使用while循环创建cron作业

时间:2017-04-27 20:07:01

标签: javascript node.js cron

有几个库(特别是NodeJS和Javascript)允许您实现cron作业,然后将它们托管在服务器上。

从本质上讲,cron工作在我看来只不过是在一天的特定时间/日期执行的重复性任务。

我想知道这些库之间的区别是什么,只是让我们说一个自定义的while循环。例如在Javascript中我们可以写:

var keepRunning = true
while (keepRunning) {
    setTimeout(function () {
        // call function to be executed when time constraint satisfied
    }, 5000);
}

我的问题是:

  • 为什么我们使用cron作业库?上面的自定义函数有什么好处?

3 个答案:

答案 0 :(得分:1)

Cron处理非常具体的时间事件比这更好。如果你想在每天上午9点发生某些事情,你绝对不得不使用Cron这样的方法。

Cron从时代开始测量时间,是调度任务的最准确方法。我还想象它会比你建议的更好。

你为什么不使用Cron?

答案 1 :(得分:1)

库是有用代码的集合。这些集合倾向于组合大量的功能,对象等。

你的例子只是一种几乎没有多功能性的情况。库将为您的循环提供更多选项,并且不仅仅是解决速率问题,还包括其他因素(取决于您所指的特定库)。

答案 2 :(得分:1)

这不会像您预期的那样起作用:

var keepRunning = true
while (keepRunning) {
    setTimeout(function () {
        // call function to be executed when time constraint satisfied
    }, 5000);
}

该代码将尽可能快地安排新的setTimeout回调,而keepRuning为真,永远不会展开调用堆栈并让事件循环运行任何这些回调。如果不运行预定代码,它可能会占用你所有的内存。

你可以做的是这样的事情:

var keepRunning = true;
function run() {
  if (keepRunning) {
    // call function to be executed when time constraint satisfied
    setTimeout(run, 5000);
  }
}
setTimeout(run, 5000);

如果您想一次安排所有回调,那么您可能会这样做:

for (let i = 1; i <= 100; i++) {
    setTimeout(function () {
        // call function to be executed when time constraint satisfied
    }, 5000 * i);
}

但是在这个示例中,您需要将超时乘以迭代变量,以确保它们不会被安排在同一时间运行 - 即它们仍然是一次性安排,但它们稍后会在不同时间运行。 / p>

请记住,JavaScript运行完成,并且稍后在调用堆栈展开时执行回调。同样重要的是forwhile循环阻止事件循环执行,并且在循环运行时不能处理任何事件。