Backbone.jsの各オブジェクトにcronによる時間指定でメソッドを実行する機能を仕込むことができます。
定期的にfetch()
させたいけどsetInterval()
だとちょっと物足りない場合などにどうぞ。
backbone.cron.jsをbackbone.jsの後にロードしてください。
<script type="text/javascript" src="/path/to/backbone.js"></script>
<script type="text/javascript" src="backbone.cron.js"></script>
Backbone.~.extend
のinitialize()
でBackbone.Cronオブジェクトを作成します。
var HogeModel = Backbone.Model.extend({
initialize: function () {
this.cron = new Backbone.Cron(this, {
test1: '0,45,20-23 * * * * * test1',
test2: '39 */6,10,20,40,50 * * * * test2',
test3: '0 */5 */2 * * * test2'
});
},
test1: function (label, now) {
console.log(label, now);
},
test2: function (label, now) {
console.log(label, now);
}
});
引数2のcrontabで指定したメソッドを実行させるオブジェクトです。大抵の場合はthis
で良いと思います(上記の例ではthis
= HogeModelオブジェクト)。
ラベル
:crontab
のペアからなる連想配列を指定します。crontabは
秒
分
時
日
月
曜日
実行するメソッド
の順に半角スペース区切りで指定します。一通りのcrontab書式が指定可能です。
ここで指定したメソッドが呼び出される時には(ラベル
、現在日時のDateオブジェクト
)の2つが引数で渡されます。
デフォルトではBackbone.Cronをnewした時点でタイマーが作動します。とりあえずnewはするけど実行はちょっと後でという場合にはfalse
を指定してください。そして必要になったらstart()
メソッドでタイマーを作動させてください。
作成したBackbone.Cronオブジェクトのタイマーを作動させます。
Backbone.Cronオブジェクトのタイマーを停止させます。crontabで登録した全ての処理がストップされます。
指定したラベルの処理だけ実行させないようにします。
off()
で止めたラベルの処理を再度実行させるようにします。
Backbone.Cronを仕込んだオブジェクトを削除する前には必ずstop()
メソッドでタイマーを止めてください。そうしないとオブジェクトを削除した後にもタイマー処理が動き続け、メモリリークが発生します。
なお、Backbone.Cronの内部では、remove
イベントでstop()
が発生するようにbindしているので、Backbone.Modelに関連付けられたBackbone.Cronオブジェクトに関しては、Model削除時に自動的にタイマーが停止されます。
ただし、Collection.reset()
の場合、(Backbone.jsバージョン1.0.0の段階では)Modelに対してremove
イベントが発生しないのでタイマーが停止されません。そこで、Backbone.Collection.extendでreset()
の処理を以下の様に拡張しておけば、reset()
時にremove
イベントが発火されるようになります。
var HogeCollection = Backbone.Collection.extend({
model: HogeModel,
reset: function (models, options) {
this.each(function (model) {
model.trigger('remove');
});
return HogeCollection.__super__.reset.apply(this, arguments);
},
Backbone.jsに特化しているのはremove
イベントのbindだけなので、この部分を潰せばBackbone.jsに限らず、色々なオブジェクトにCron処理を実装する事ができます(underscore.js依存ですが)。
ちなみにモダンブラウザとIE7以上で動作確認済みです。