Oluşturduğumuz nesne içerisindeki olayları takip edebilmek için listenerlara ihtiyaç duyuyoruz.
Örneğin, nesne içerisinde bir interval tanımladınız. Saniyede bir bu interval içindeki kod çalışıyor. Buraya kadar bir sorun yok. Fakat bu interval içerisinde dışarıdan bir kod çalıştırmak istiyorsunuz. İşte bunu yapabilmek için listener kullanmalıyız.
Class Oluşturma
Öncelikle game.model.js adında bir dosya oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class Game { // bu classtan bir nesne oluşturulduğu zaman listener varsayılan olarak null tanımlanıyor onTick = null; constructor(id, players, time) { this.id = id; this.players = players; this.time = time; } // oyunu başlatıyoruz start() { var interval = setInterval(() => { if (this.time > 0) { this.time -= 1; } // burada listenerı tetikliyoruz // her bir saniyede bu listener tetiklenecek if (this.onTick != null) this.onTick(); }, 1000); } // dışarıdan bu fonksiyonu kullanarak listener oluşturuyoruz setOnTickListener(l) { // bu kontrolü listener birden fazla kere tanımlanmasın diye koyuyoruz if (this.onTick != null) return; this.onTick = l; } } module.exports = Game; |
setOnTickListener() fonksiyonu ile dışarıdan listener tanımlaması yapabileceğiz.
Listener Kullanımı
app.js dosyasında öncelikle bir Game nesnesi oluşturuyoruz. Daha sonra aşağıda gördüğünüz gibi listener tanımlaması yapıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 |
// game.model.js dosyamızı çağırıyoruz const Game = require('./game.model.js'); // yeni bir nesne oluşturuyoruz var game = new Game('18815616', null, 30); // bu nesneye özel bir listener oluşturuyoruz game.setOnTickListener(() => { console.log('game time: ' + game.time); }); game.start(); |
Artık interval içerisinde dışarıdan (farklı bir dosyadan) kodlar çalıştırabiliriz.
app.js dosyasını çalıştırdığımız zaman konsolda aşağıdaki gibi bir çıktıyla karşılaşacağız.
1 2 3 4 5 6 7 8 9 |
game time: 29 game time: 28 game time: 27 game time: 26 game time: 25 game time: 24 game time: 23 game time: 22 game time: 21 |