Menu
CoddyTech

Olay Yayıcıları

Coddy'nin Node.js Journey'sinin Node.js Temelleri bölümünün bir parçası. Ders 29 / 33.

Mağaza, bunu kimin duymak istediğini bilmeden bir notun eklendiğini duyurmalı.

node:events içindeki bir EventEmitter, her olay adı için dinleyicilerin listesini tutar. on(name, fn) bir dinleyici ekler; emit(name, ...args) bu ad için tüm dinleyicileri, bu argümanlarla hemen çağırır. Yayımlamadan sonra eklenen bir dinleyici hiçbir şey duymaz.

import { EventEmitter } from 'node:events';

const door = new EventEmitter();
door.on('open', (who) => console.log(`${who} came in`));
door.on('open', () => console.log('Ding!'));
door.emit('open', 'Ada');
// Ada içeri girdi, ardından Ding!

new EventEmitter(), on ve emit yöntemlerine sahip bir nesne olan bir yayıcı oluşturur. Mevcut bir nesneye bu yöntemleri eklemek için özelliklerini yeni bir yayıcıya kopyalayın: Object.assign(new EventEmitter(), { notes: [] }), notes özelliğine de sahip bir yayıcı döndürür.

challenge icon

Görev

Kolay

Bu adım, Timers dersindeki proje dosyaların yerine kurs için hazırlanmış notlar komut satırı aracı projesini açar (notes.js dâhil). Önceki çalışmaların kendi dersinde kalır. store.js dosyasını düzenlemeden önce sağlanan dosyaları oku. Bu kopya, not komutlarını ve eşzamansız dosya yardımcılarını içerir.

Depo her yeni notu duyurmalı ve diğer kodların bununla ilgili ne yapacağına karar vermesine izin vermelidir. Depoyu bir olay yayıcısına dönüştür.

  1. store.js dosyasında store nesnesini, kendi tüm özelliklerini ve yöntemlerini koruyan bir EventEmitter yap. EventEmitter öğesini node:events modülünden içe aktar. new EventEmitter() yeni ve boş bir yayıcı oluşturur. Derste gösterildiği gibi, deponun nesnesini Object.assign ile bu yayıcıya kopyala.
  2. store.js dosyasında, add içinde, notlar kaydedildikten sonra notun metni ve numarası olmak üzere iki değerle added olayını yay.
  3. notes.js dosyasında depodaki added olayını dinle. Dinleyici Saved note metnini, numarayı ve noktayı yazdırır. Komutlar çalışmadan önce, dosyanın üst tarafına yakın bir yere ekle; böylece add olayı yaydığında dinleyici zaten dinliyor olur. Artık add dalı kendisi hiçbir şey yazdırmaz; yalnızca store.add çağrısını yapar.

node notes.js add Buy bread yeni notun numarasını içeren tek bir satır yazdırır; örneğin:

Saved note 3.

clear komutundan sonra add Buy milk, Saved note 1. yazdırır; add Call Ada ise Saved note 2. yazdırır.

Dene: $ node notes.js ifadesinden sonra kutuya add Buy bread yaz ve Enter tuşuna bas. Dinleyicinin yazdırdığı Saved note metnini ve yeni numarayı görürsün. Ardından clear, add Buy milk ve add Call Ada yaz: önce Saved note 1., sonra Saved note 2. görürsün.

Kendin dene

import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';

const file = 'notes.json';

const readJson = async (name, fallback) => {
    if (!existsSync(name)) {
        return fallback;
    }
    try {
        return JSON.parse(await readFile(name, 'utf8'));
    } catch (err) {
        console.error(`${name} is damaged: ${err.message}`);
        process.exit(1);
    }
};

const [notes, settings] = await Promise.all([readJson(file, []), readJson('settings.json', {})]);

const store = {
    notes,
    settings,
    async save() {
        await writeFile(file, JSON.stringify(this.notes, null, 2));
    },
    async add(text) {
        this.notes.push(text);
        await this.save();
        return this.notes.length;
    },
    async remove(n) {
        const [text] = this.notes.splice(n - 1, 1);
        await this.save();
        return text;
    },
};

export default store;
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Node.js Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Express playground