JavaScript:节点cron和节点计划作业立即执行,而不是将来执行

时间:2014-12-13 21:46:15

标签: javascript node.js cron scheduler job-scheduling

我正在尝试编写测试脚本,作为更大项目的一部分,这将允许我安排未来的短信警报。在我的脚本中,我尝试使用节点包cron和node-schedule。我将日期对象设置为将来设置为三分钟。我使用这两个包来安排工作。但是,消息不会在正确的时间发送,而是立即发送。

我希望我的代码在将来的某个时间执行,有没有人知道为什么下面的代码不起作用?

var CronJob = require('cron').CronJob;
var twilSms = require('./TwilSms');
var schedule = require('node-schedule');

var sendInThree = function(to,message) {
    var threeMinutes = 180000;
    var inThreeMinutes = new Date(Date.now()+threeMinutes);
    process.stdout.write("A text message should be sent at: \n" + inThreeMinutes.toString() + '\n');

    //TRIGGERS INSTANTLY
    var sched = schedule.scheduleJob(inThreeMinutes,twilSms.sendSms(to,
                   ('Did this message arrive at: ' + inThreeMinutes.toString() + '?')));


    //TRIGGERS INSTANTLY
    var cronSMS = new CronJob(inThreeMinutes,
                twilSms.sendSms(to,
                    ('Did this message arrive at: ' + inThreeMinutes.toString() + '?')),
                null, true);
}


sendInThree('13125555555');

注意:

function twilSms.sendSms()在Node REPL中按预期工作。
我只使用假号上传到SO。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

你应该传入一个可调用的,例如匿名函数作为CronJob构造函数的第二个参数。在您的代码中,您传递的返回值为twilSms.sendSms(),在这种情况下sendSms()会立即执行(因为它最后由()调用)。函数调用是另一个函数的参数并不重要,它在解释器处理该行时立即执行。

var cronSMS = new CronJob(inThreeMinutes, function() {
                twilSms.sendSms(to,
                    ('Did this message arrive at: ' + inThreeMinutes.toString() + '?')) },
                null, true);

更新1

如果您在指定参数时不想使用匿名函数,则可以将函数指定给命名变量 - 但它仍然必须是CronJob期望的可调用函数。 E.g。

var sendSmsFunc = function() {
    twilSms.sendSms(to,
         ('Did this message arrive at: ' + inThreeMinutes.toString() + '?'))
}

var cronSMS = new CronJob(inThreeMinutes, sendSmsFunc, null, true);

您在第二条评论中的示例似乎不正确,因为虽然sendSMS在这种情况下是可调用的,但它在运行时需要两个参数。 CronJob不会传递任何参数,所以它必须是一个可调用的,不要求参数只是想在运行时调用(或执行)来完成它的工作。

更新2

如果您希望在为sendSms()指定参数的同时将参数传递给CronJob(),则可以使用返回函数的函数,例如

var sendSmsFunc = function(to, message) {
    return function() {
        twilSms.sendSms(to, message);
    }
}

var cronSMS = new CronJob(inThreeMinutes, sendSmsFunc("123", "test message"), null, true);