2014-12-13 2 views
0

미래의 문자 메시지 알림을 예약 할 수있는 더 큰 프로젝트의 일환으로 테스트 스크립트를 작성하려고합니다. 스크립트에서 cron과 node-schedule 노드 패키지를 모두 사용하려고합니다. 앞으로 3 분으로 설정된 날짜 개체를 구성합니다. 두 가지 패키지를 모두 사용하여 작업을 예약합니다. 그러나 메시지는 적시에 전송되지는 않지만 즉시 전송됩니다.자바 스크립트 : 노드 크론 및 노드 스케줄 작업이 미래가 아닌 즉시 실행됩니다.

미래에 설정 한 시간에 코드를 실행하고 싶다면 다음 코드가 작동하지 않는 이유를 아는 사람이 있습니까?

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'); 

NOTES : 노드 REPL 예상대로

twilSms.sendSms 함수() workes.
나는 SO에 업로드 할 때만 가짜 번호를 사용했습니다.

도움 주셔서 감사합니다.

답변

3

예를 들어, 익명 함수는 CronJob 생성자에 대한 두 번째 매개 변수입니다. 귀하의 코드에서 twilSms.sendSms()의 반환 값을 전달하는 중입니다.이 경우 sendSms()이 즉시 실행됩니다 (결국 ()에 의해 호출되기 때문에). 함수 호출이 다른 함수에 대한 매개 변수가 아니라면 인터프리터가 해당 라인을 처리 할 때 즉시 실행됩니다.

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

업데이트 1

당신은 매개 변수를 지정할 때, 명명 된 변수에 기능을 할당 할 수있는 익명 함수를 사용하지 않을 경우 -하지만 여전히으로 호출 할 수있다 CronJob은 예상합니다. 예 : sendSMS 그 경우에 호출하지만, 그것은 런타임에 두 개의 매개 변수를 예상하기 때문에

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

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

당신이 당신의 2 코멘트에있는 예는, 잘 보이지 않는다. CronJob은 매개 변수를 전달하지 않으므로 런타임에 매개 변수가 단순히 호출 (또는 실행)되기를 원할 것으로 기대하지 않는 호출 가능 매개 변수 여야합니다.

업데이트

당신이 CronJob()에 매개 변수를 지정할 때, 당신은 함수를 반환하는 함수, 예를 들어, 사용할 수 있습니다 동시에 sendSms()에 매개 변수를 전달 할 수있게하려면 2

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

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

Macell! 귀하의 제안이 효과가있었습니다. 익명 함수 내에서 함수를 래핑하는 것을 피할 수있는 방법이 있습니까? 구문론적인 설탕 은요? 익명의 함수에서 호출 할 수 있도록 표준 함수와의 차이점을 설명하는 것을 권유합니다. – ChitownDev

+0

예를 들어 리팩토링해야한다고 생각하십니까? var sendSMS = function (to, message) { client.messages.create (smsFactoryFromDefault (to, message)); } module.exports.sendSms = sendSMS; – ChitownDev

+1

내 업데이 트를 참조하십시오. – marekful