2012-12-14 55 views
1

我試圖找出執行任務的最佳方式,例如,將來發送電子郵件給用戶。在將來執行幾天或幾個月的操作

我的想法是在需要發送電子郵件時(在用戶數據庫中存儲數據)以及每天檢查用戶需要發送電子郵件的內容以及使用流星計時器功能。

// 7 hours in millisec. 
Meteor.setTimeout(function() { 
    Meteor.call("sendReminderEmail", ...); 
}, 2.52e+7); 

我看到的問題是設置了太多定時器,並且阻礙了性能。什麼是好的解決方案?

編輯:基本上我的使用案例包括用戶創建一個事件,他們設定一個長期事件或短期(以天,周或月),他們收到的是後續事件取決於持續時間。

我想我可以檢查每個小時,但這似乎是一個成本相同的問題。有流星的具體方式來做到這一點?或者只是一個更好的概念?

編輯2:好的,我已經意識到,準確性對我的問題並不重要,所以我打算在每個時區設置一個計時器,這會發送大量電子郵件。如果用戶有一個長期的事件,並且他們的提醒是在本週,那麼現在就發送它。基本上它取決於用戶的事件和時區的持續時間。

所以我更新的問題是,我如何在日常的基礎上運行某些內容,並考慮到我的問題?

+0

如果你每天都在檢查,你爲什麼要使用7小時超時? –

+0

更少發郵件? –

+0

@ŠimeVidas從一天開始的7個小時。 – knownasilya

回答

2

假設您想要在今天早上9點執行代碼,現在是早上8點,您可以創建超時以匹配目標時間的分鐘數,然後創建1小時的間隔,並在每次執行時檢查時間早上九點,如果是,執行。

在這個小規模的例子

,我執行executeMe()當時鍾劃分爲9秒時:

現場測試:http://jsbin.com/ikulok/4/edit

<body> 
Last run: <span id="time"></span><br> 
Next execution: <span id="target"></span> 
<script type="text/javascript"> 
    function executeMe(){ 
     alert("9 seconds!"); 
    } 
    var timeout = null; 
    var interval = null; 
    function timer(){ 
     var now = new Date(); 
     document.getElementById('time').innerHTML = now; 
     document.getElementById('target').innerHTML = new Date(now.getTime()+ 1000); 
     //console.log("timer()", now); 

     if(now.getSeconds() == 9) 
     setTimeout("executeMe();",1); // async 

     if(interval == null) 
     interval = setInterval("timer()",1000); 
    } 

    var now = new Date(); 
    var target = new Date(now.getFullYear(),now.getMonth(),now.getDate(),now.getHours(),now.getMinutes(),now.getSeconds()+1,0); 
    //console.log("now", now); 
    //console.log("target", target); 
    //console.log("diff", target.getTime() - now.getTime()); 
    document.getElementById('target').innerHTML = target; 
    timeout = setTimeout("timer()", target.getTime() - now.getTime()); 
    </script> 


如果你想運行timer()每小時而不是每秒,只需調整targetsetInterval(),當然你的條件

現場測試:http://jsbin.com/ikulok/3/edit

<body> 
    Last run: <span id="time"></span><br> 
    Next execution: <span id="target"></span> 
<script type="text/javascript"> 
    function executeMe(){ 
     alert("1:20am!"); 
    } 
    var timeout = null; 
    var interval = null; 
    function timer(){ 
     var now = new Date(); 
     document.getElementById('time').innerHTML = now; 
     document.getElementById('target').innerHTML = new Date(now.getTime()+ 1*60*60*1000); 
     //console.log("timer()", now); 

     if(now.getHour() == 1) 
     setTimeout("executeMe();", 20*60*1000); // !!!! this will execute at 1:20am 

     if(interval == null) 
     interval = setInterval("timer()",1*60*60*1000); // !!!! repeat every hour 
    } 

    var now = new Date(); 

    // !!!! targeting next exact hour 
    var target = new Date(now.getFullYear(),now.getMonth(),now.getDate(),now.getHours(),now.getMinutes()+1,0,0); 
    //console.log("now", now); 
    //console.log("target", target); 
    //console.log("diff", target.getTime() - now.getTime()); 
    document.getElementById('target').innerHTML = target; 
    timeout = setTimeout("timer()", target.getTime() - now.getTime()); 
    </script> 
</body> 
+0

感謝您的示例。看我最近的編輯。 – knownasilya

+0

@Knownasilya我編輯了一個例子,告訴你如何在每個凌晨1:20執行一個函數,當然你可以給它添加更多的條件,舉一個例子 –

+0

@Knownasilya我修復了Date對象的一些錯誤,提供的例子 –

相關問題