1

将来的には、ユーザーにメールを送信するなど、タスクを実行するための最良の方法を見つけようとしています。

私の考えは、メールを送信する必要があるときに(ユーザーデータと一緒にデータベースに)保存し、ユーザーがメールを送信する必要があるかどうかを毎日確認し、Meteorのタイマー機能を使用することです。

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

私が見ている問題は、設定されているタイマーが多すぎて、パフォーマンスが低下していることです。良い解決策は何ですか?

編集:基本的に、私のユースケースには、ユーザーがイベントを作成し、それを長期イベントまたは短期(日、週、または月に基づく)として設定し、期間に応じてそのイベントのフォローアップを受け取ることが含まれます。

1時間ごとにチェックできると思いますが、それは同じコストの問題のようです。これを行うためのMeteor固有の方法はありますか?それとももっと良いコンセプトですか?

Edit2:わかりました。問題にとって精度はそれほど重要ではないことに気付いたので、タイムゾーンごとに1つのタイマーを設定して、大量のメールを送信することを考えています。ユーザーに長期的なイベントがあり、そのリマインダーが今週である場合は、今すぐ送信してください。基本的には、イベントの期間とユーザーのタイムゾーンによって異なります。

だから私の更新された質問は、私の問題を念頭に置いて、毎日何かを実行するにはどうすればよいですか?

4

1 に答える 1

2

今日の午前9時にコードを実行し、現在は午前8時であるとすると、目標時間の分に一致するタイムアウトを作成してから1時間の間隔を作成し、実行ごとに時刻が午前9時かどうかを確認できます。 、 実行する。

この小規模な例では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()毎秒ではなく毎時実行したい場合はtarget、とを調整するだけsetInterval()で、もちろん条件を調整できます

ライブテスト: 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>
于 2012-12-14T17:16:46.217 に答える