我正在尝试编写测试脚本,作为更大项目的一部分,这将允许我安排未来的短信警报。在我的脚本中,我尝试使用节点包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。
感谢您的帮助。
答案 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);