{"id":35611,"date":"2025-12-01T18:41:37","date_gmt":"2025-12-01T15:41:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35611"},"modified":"2025-12-01T18:41:37","modified_gmt":"2025-12-01T15:41:37","slug":"event-emitter-nedir-ve-neden-kullanilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/","title":{"rendered":"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<p>Node.js, asenkron ve olay tabanl\u0131 mimarisiyle bilinen g\u00fc\u00e7l\u00fc bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Bu mimarinin temel ta\u015flar\u0131ndan biri de <strong>Event Emitterlar<\/strong>d\u0131r. Event Emitterlar, Node.js uygulamalar\u0131nda mod\u00fcller aras\u0131 ileti\u015fimi sa\u011flaman\u0131n, durum de\u011fi\u015fikliklerini y\u00f6netmenin ve uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerini birbirinden ba\u011f\u0131ms\u0131z hale getirmenin zarif bir yolunu sunar. Bu rehberde, Event Emitterlar\u0131n ne oldu\u011funu, nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131, en iyi uygulamalar\u0131 ve pratik senaryolar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?<\/h2>\n<p>Event Emitterlar, &#8220;yay\u0131nla-abone ol&#8221; (publish-subscribe) deseninin Node.js&#8217;teki temel uygulamas\u0131d\u0131r. Bu desen, bir olay\u0131n ger\u00e7ekle\u015fti\u011fini duyuran bir &#8220;yay\u0131nc\u0131&#8221; (emitter) ve bu olay\u0131 dinleyerek belirli bir eylemi ger\u00e7ekle\u015ftiren bir veya daha fazla &#8220;abone&#8221; (listener) aras\u0131nda gev\u015fek bir ba\u011flant\u0131 kurar.<\/p>\n<h3>Neden Kullanmal\u0131y\u0131z?<\/h3>\n<ul>\n<li><strong>Mod\u00fclerlik ve Ay\u0131rma (Decoupling):<\/strong> Uygulaman\u0131z\u0131n farkl\u0131 par\u00e7alar\u0131n\u0131n do\u011frudan birbirini \u00e7a\u011f\u0131rmak yerine olaylar arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. Bu, kodu daha temiz, daha anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 daha kolay hale getirir.<\/li>\n<li><strong>Esneklik:<\/strong> Yeni olay dinleyicileri eklemek veya mevcut olanlar\u0131 kald\u0131rmak, yay\u0131nc\u0131 kodunu de\u011fi\u015ftirmeye gerek kalmadan kolayca yap\u0131labilir.<\/li>\n<li><strong>Asenkron \u0130\u015fleme:<\/strong> Node.js&#8217;in asenkron do\u011fas\u0131na m\u00fckemmel uyum sa\u011flar. Olaylar genellikle arka planda ger\u00e7ekle\u015fen i\u015flemleri tetiklemek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong>Durum Y\u00f6netimi:<\/strong> Bir nesnenin veya sistemin durumundaki de\u011fi\u015fiklikleri di\u011fer bile\u015fenlere bildirmek i\u00e7in idealdir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kaydolmas\u0131, bir dosyan\u0131n y\u00fcklenmesi veya bir veritaban\u0131 i\u015fleminin tamamlanmas\u0131 gibi olaylar\u0131 yay\u0131nlayabilirsiniz.<\/li>\n<li><strong>Node.js \u00c7ekirde\u011fi:<\/strong> HTTP sunucular\u0131, dosya sistemi i\u015flemleri, stream&#8217;ler gibi Node.js&#8217;in bir\u00e7ok dahili mod\u00fcl\u00fc Event Emitter desenini yo\u011fun bir \u015fekilde kullan\u0131r. Bu, sizin de kendi uygulaman\u0131zda ayn\u0131 deseni benimsemenizi kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Event Emitterlar, Node.js&#8217;in <code>events<\/code> mod\u00fcl\u00fc taraf\u0131ndan sa\u011flan\u0131r.<\/p>\n<h2>Event Emitter Temelleri: Olu\u015fturma, Dinleme ve Yay\u0131nlama<\/h2>\n<p>Event Emitter kullanmaya ba\u015flamak olduk\u00e7a basittir. \u0130\u015fte temel ad\u0131mlar:<\/p>\n<h3>1. Event Emitter Olu\u015fturma<\/h3>\n<p>Kendi Event Emitter&#8217;\u0131n\u0131z\u0131 iki ana yolla olu\u015fturabilirsiniz:<\/p>\n<ol>\n<li>Do\u011frudan <code>EventEmitter<\/code> s\u0131n\u0131f\u0131n\u0131n bir \u00f6rne\u011fini olu\u015fturarak:<\/li>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n<\/code><\/pre>\n<li>Kendi s\u0131n\u0131f\u0131n\u0131z\u0131 <code>EventEmitter<\/code>&#8216;dan miras alarak (tercih edilen y\u00f6ntem, daha d\u00fczenli bir yap\u0131 sa\u011flar):<\/li>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\n\nclass MyCustomEmitter extends EventEmitter {\n  constructor() {\n    super(); \/\/ EventEmitter constructor'\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r\n  }\n}\n\nconst myCustomEmitter = new MyCustomEmitter();\n<\/code><\/pre>\n<\/ol>\n<h3>2. Olaylar\u0131 Dinleme (Subscribing)<\/h3>\n<p>Bir olay\u0131 dinlemek i\u00e7in <code>on()<\/code> veya <code>addListener()<\/code> metodunu kullan\u0131r\u0131z. Bu metotlar iki arg\u00fcman al\u0131r: dinlenecek olay\u0131n ad\u0131 (string) ve olay ger\u00e7ekle\u015fti\u011finde \u00e7al\u0131\u015ft\u0131r\u0131lacak bir callback fonksiyonu.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\n\/\/ 'selam' olay\u0131n\u0131 dinle\nmyEmitter.on('selam', () => {\n  console.log('Merhaba D\u00fcnya!');\n});\n\n\/\/ Olay dinleyicisine arg\u00fcman ge\u00e7irme\nmyEmitter.on('kullaniciKaydoldu', (kullaniciAdi, email) => {\n  console.log(<code>Yeni kullan\u0131c\u0131 kaydoldu: ${kullaniciAdi} (${email})<\/code>);\n});\n<\/code><\/pre>\n<h3>3. Olaylar\u0131 Yay\u0131nlama (Emitting)<\/h3>\n<p>Bir olay\u0131 tetiklemek veya yay\u0131nlamak i\u00e7in <code>emit()<\/code> metodunu kullan\u0131r\u0131z. <code>emit()<\/code> metodu ilk arg\u00fcman olarak olay\u0131n ad\u0131n\u0131 al\u0131r ve sonraki t\u00fcm arg\u00fcmanlar, olay dinleyicilerine (callback fonksiyonlar\u0131na) iletilir.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\nmyEmitter.on('selam', () => {\n  console.log('Merhaba D\u00fcnya!');\n});\n\nmyEmitter.on('kullaniciKaydoldu', (kullaniciAdi, email) => {\n  console.log(<code>Yeni kullan\u0131c\u0131 kaydoldu: ${kullaniciAdi} (${email})<\/code>);\n});\n\n\/\/ 'selam' olay\u0131n\u0131 yay\u0131nla\nmyEmitter.emit('selam'); \/\/ \u00c7\u0131kt\u0131: Merhaba D\u00fcnya!\n\n\/\/ 'kullaniciKaydoldu' olay\u0131n\u0131 arg\u00fcmanlarla yay\u0131nla\nmyEmitter.emit('kullaniciKaydoldu', 'Ali Veli', 'ali.veli@example.com'); \n\/\/ \u00c7\u0131kt\u0131: Yeni kullan\u0131c\u0131 kaydoldu: Ali Veli (ali.veli@example.com)\n\n\/\/ Dinleyicisi olmayan bir olay\u0131 yay\u0131nlamak hi\u00e7bir \u015fey yapmaz\nmyEmitter.emit('bilinmeyenOlay'); \n<\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> Olaylar, dinleyiciler eklenmeden <strong>\u00f6nce<\/strong> yay\u0131nlan\u0131rsa, bu olaylar ka\u00e7\u0131r\u0131l\u0131r. Dinleyicilerin her zaman olay yay\u0131nlanmadan \u00f6nce kaydedilmesi gerekir.<\/p>\n<h2>Geli\u015fmi\u015f Kullan\u0131m ve En \u0130yi Uygulamalar<\/h2>\n<p>Event Emitter&#8217;lar\u0131n temel kullan\u0131m\u0131n\u0131 anlad\u0131ktan sonra, daha g\u00fc\u00e7l\u00fc ve g\u00fcvenli uygulamalar geli\u015ftirmek i\u00e7in baz\u0131 geli\u015fmi\u015f \u00f6zelliklere ve en iyi uygulamalara g\u00f6z atal\u0131m.<\/p>\n<h3>1. Tek Seferlik Dinleyiciler: <code>once()<\/code><\/h3>\n<p>Bazen bir olay\u0131n yaln\u0131zca bir kez dinlenmesini ve ard\u0131ndan dinleyicinin kald\u0131r\u0131lmas\u0131n\u0131 istersiniz. Bunun i\u00e7in <code>once()<\/code> metodunu kullanabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\nlet sayac = 0;\nmyEmitter.once('veriGeldi', () => {\n  sayac++;\n  console.log(<code>Veri ilk kez geldi. Saya\u00e7: ${sayac}<\/code>);\n});\n\nmyEmitter.emit('veriGeldi'); \/\/ \u00c7\u0131kt\u0131: Veri ilk kez geldi. Saya\u00e7: 1\nmyEmitter.emit('veriGeldi'); \/\/ Hi\u00e7bir \u015fey olmaz, dinleyici kald\u0131r\u0131ld\u0131\nmyEmitter.emit('veriGeldi'); \/\/ Hala hi\u00e7bir \u015fey olmaz\n<\/code><\/pre>\n<h3>2. Dinleyicileri Kald\u0131rma: <code>removeListener()<\/code> ve <code>removeAllListeners()<\/code><\/h3>\n<p>Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek ve gereksiz i\u015flem y\u00fck\u00fcn\u00fc azaltmak i\u00e7in art\u0131k ihtiya\u00e7 duyulmayan olay dinleyicilerini kald\u0131rmak \u00f6nemlidir. \u00d6zellikle uzun \u00f6m\u00fcrl\u00fc nesnelerde veya dinamik olarak eklenen\/kald\u0131r\u0131lan bile\u015fenlerde bu hayati \u00f6neme sahiptir.<\/p>\n<ul>\n<li><strong><code>removeListener(eventName, listenerFunction)<\/code> veya <code>off(eventName, listenerFunction)<\/code>:<\/strong> Belirli bir olay i\u00e7in belirli bir dinleyici fonksiyonunu kald\u0131r\u0131r. Fonksiyonun referans\u0131n\u0131 iletmeniz gerekir.<\/li>\n<li><strong><code>removeAllListeners([eventName])<\/code>:<\/strong> Belirli bir olay i\u00e7in t\u00fcm dinleyicileri kald\u0131r\u0131r. E\u011fer <code>eventName<\/code> belirtilmezse, emitter \u00fczerindeki t\u00fcm olaylar i\u00e7in t\u00fcm dinleyicileri kald\u0131r\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\nfunction mesajDinleyici() {\n  console.log('Bir mesaj geldi!');\n}\n\nfunction uyariDinleyici() {\n  console.log('Bir uyar\u0131 geldi!');\n}\n\nmyEmitter.on('mesaj', mesajDinleyici);\nmyEmitter.on('mesaj', () => console.log('Ba\u015fka bir mesaj dinleyicisi.'));\nmyEmitter.on('uyari', uyariDinleyici);\n\nconsole.log('Mesaj dinleyici say\u0131s\u0131:', myEmitter.listenerCount('mesaj')); \/\/ \u00c7\u0131kt\u0131: 2\n\nmyEmitter.emit('mesaj'); \/\/ \u0130ki mesaj dinleyicisi de \u00e7al\u0131\u015f\u0131r\n\nmyEmitter.removeListener('mesaj', mesajDinleyici); \/\/ \u0130lk dinleyiciyi kald\u0131r\n\nconsole.log('Mesaj dinleyici say\u0131s\u0131 (kald\u0131rma sonras\u0131):', myEmitter.listenerCount('mesaj')); \/\/ \u00c7\u0131kt\u0131: 1\n\nmyEmitter.emit('mesaj'); \/\/ Sadece ikinci mesaj dinleyicisi \u00e7al\u0131\u015f\u0131r\n\nmyEmitter.removeAllListeners('uyari'); \/\/ 'uyari' olay\u0131n\u0131n t\u00fcm dinleyicilerini kald\u0131r\nconsole.log('Uyar\u0131 dinleyici say\u0131s\u0131 (kald\u0131rma sonras\u0131):', myEmitter.listenerCount('uyari')); \/\/ \u00c7\u0131kt\u0131: 0\n\nmyEmitter.removeAllListeners(); \/\/ T\u00fcm olaylar\u0131n t\u00fcm dinleyicilerini kald\u0131r\nconsole.log('T\u00fcm dinleyiciler kald\u0131r\u0131ld\u0131.');\n<\/code><\/pre>\n<h3>3. Hata Olaylar\u0131n\u0131 Y\u00f6netme: <code>'error'<\/code><\/h3>\n<p>Node.js&#8217;te, bir Event Emitter bir <code>'error'<\/code> olay\u0131 yay\u0131nlad\u0131\u011f\u0131nda ve bu olay\u0131n dinleyicisi yoksa, Node.js s\u00fcreci varsay\u0131lan olarak <strong>\u00e7\u00f6ker<\/strong>. Bu nedenle, hata olaylar\u0131n\u0131 her zaman ele almak \u00e7ok \u00f6nemlidir.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\n\/\/ Hata dinleyicisi eklenmezse uygulama \u00e7\u00f6ker!\nmyEmitter.on('error', (err) => {\n  console.error('Bir hata olu\u015ftu:', err.message);\n  \/\/ Hatan\u0131n ciddiyetine g\u00f6re burada uygun bir i\u015flem yap\u0131lmal\u0131 (\u00f6rn: loglama, uygulamay\u0131 kapatma)\n});\n\n\/\/ Hata olay\u0131n\u0131 yay\u0131nla\nmyEmitter.emit('error', new Error('Beklenmedik bir durum olu\u015ftu!')); \n\/\/ \u00c7\u0131kt\u0131: Bir hata olu\u015ftu: Beklenmedik bir durum olu\u015ftu!\n\n\/\/ A\u015fa\u011f\u0131daki kod, e\u011fer yukar\u0131da 'error' dinleyicisi olmasayd\u0131 uygulamay\u0131 \u00e7\u00f6kerirdi:\n\/\/ myEmitter.emit('error', new Error('Ba\u015fka bir hata!'));\n<\/code><\/pre>\n<h3>4. Maksimum Dinleyici Say\u0131s\u0131: <code>setMaxListeners()<\/code><\/h3>\n<p>Varsay\u0131lan olarak, bir Event Emitter i\u00e7in belirli bir olaya ekleyebilece\u011finiz dinleyici say\u0131s\u0131 10 ile s\u0131n\u0131rl\u0131d\u0131r. 10&#8217;dan fazla dinleyici eklerseniz, Node.js bir uyar\u0131 yay\u0131nlar (uygulaman\u0131z \u00e7\u00f6kmez). Bu limit, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 veya performans sorunlar\u0131n\u0131 i\u015faret edebilecek potansiyel sorunlar\u0131 tespit etmek i\u00e7in bir g\u00fcvenlik \u00f6nlemidir. Bu limiti <code>setMaxListeners()<\/code> ile de\u011fi\u015ftirebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\nmyEmitter.setMaxListeners(20); \/\/ Maksimum dinleyici say\u0131s\u0131n\u0131 20 olarak ayarla\n\nfor (let i = 0; i < 15; i++) {\n  myEmitter.on(&#039;data&#039;, () => console.log(<code>Dinleyici ${i} veri ald\u0131.<\/code>));\n}\n\/\/ Bu durumda 15 dinleyici eklendi\u011fi i\u00e7in uyar\u0131 almay\u0131z.\n\/\/ E\u011fer setMaxListeners() kullanmasayd\u0131k 11. dinleyiciden itibaren uyar\u0131 al\u0131rd\u0131k.\n<\/code><\/pre>\n<h3>5. Asenkron vs. Senkron \u00c7al\u0131\u015fma<\/h3>\n<p>Event Emitterlar olaylar\u0131 senkron olarak yay\u0131nlar, yani <code>emit()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, t\u00fcm dinleyiciler s\u0131rayla hemen \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Ancak, dinleyicinin i\u00e7indeki kod asenkron olabilir.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\nmyEmitter.on('asyncEvent', () => {\n  console.log('Dinleyici 1: Hemen \u00e7al\u0131\u015ft\u0131.');\n  setTimeout(() => {\n    console.log('Dinleyici 1: Asenkron i\u015flem bitti.');\n  }, 100);\n});\n\nmyEmitter.on('asyncEvent', () => {\n  console.log('Dinleyici 2: Hemen \u00e7al\u0131\u015ft\u0131.');\n});\n\nconsole.log('Olay\u0131 yay\u0131nlamadan \u00f6nce.');\nmyEmitter.emit('asyncEvent');\nconsole.log('Olay\u0131 yay\u0131nlad\u0131ktan sonra.');\n\n\/* \u00c7\u0131kt\u0131 s\u0131ras\u0131:\nOlay\u0131 yay\u0131nlamadan \u00f6nce.\nDinleyici 1: Hemen \u00e7al\u0131\u015ft\u0131.\nDinleyici 2: Hemen \u00e7al\u0131\u015ft\u0131.\nOlay\u0131 yay\u0131nlad\u0131ktan sonra.\nDinleyici 1: Asenkron i\u015flem bitti.\n*\/\n<\/code><\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>emit()<\/code> \u00e7a\u011fr\u0131s\u0131, t\u00fcm senkron dinleyiciler tamamlanana kadar bloke olur. E\u011fer bir olay\u0131n yay\u0131nlanmas\u0131n\u0131n tamamen asenkron olmas\u0131n\u0131 ve di\u011fer kodun \u00e7al\u0131\u015fmas\u0131n\u0131 engellememesini istiyorsan\u0131z, <code>process.nextTick()<\/code> veya <code>setImmediate()<\/code> gibi mekanizmalar\u0131 kullanabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\nconst myEmitter = new EventEmitter();\n\nmyEmitter.on('nextTickEvent', () => {\n  process.nextTick(() => {\n    console.log('Dinleyici: nextTick ile asenkron \u00e7al\u0131\u015ft\u0131.');\n  });\n});\n\nconsole.log('Olay\u0131 yay\u0131nlamadan \u00f6nce.');\nmyEmitter.emit('nextTickEvent');\nconsole.log('Olay\u0131 yay\u0131nlad\u0131ktan sonra.');\n\n\/* \u00c7\u0131kt\u0131 s\u0131ras\u0131:\nOlay\u0131 yay\u0131nlamadan \u00f6nce.\nOlay\u0131 yay\u0131nlad\u0131ktan sonra.\nDinleyici: nextTick ile asenkron \u00e7al\u0131\u015ft\u0131.\n*\/\n<\/code><\/pre>\n<h2>Pratik Uygulama Senaryolar\u0131<\/h2>\n<p>Event Emitter&#8217;lar, Node.js uygulamalar\u0131nda bir\u00e7ok farkl\u0131 senaryoda kullan\u0131labilir. \u0130\u015fte baz\u0131 \u00f6rnekler:<\/p>\n<h3>1. \u00d6zel Mod\u00fcller ve Servisler Aras\u0131 \u0130leti\u015fim<\/h3>\n<p>Kendi uygulaman\u0131zda farkl\u0131 mod\u00fcllerin veya servislerin birbirleriyle do\u011frudan ba\u011f\u0131ml\u0131l\u0131k olmadan ileti\u015fim kurmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ userManager.js\nconst EventEmitter = require('events');\n\nclass UserManager extends EventEmitter {\n  constructor() {\n    super();\n  }\n\n  kayitOl(kullaniciAdi, sifre) {\n    \/\/ Kullan\u0131c\u0131 kaydetme mant\u0131\u011f\u0131...\n    console.log(<code>${kullaniciAdi} adl\u0131 kullan\u0131c\u0131 kaydediliyor...<\/code>);\n    \/\/ Kay\u0131t ba\u015far\u0131l\u0131 oldu\u011funda bir olay yay\u0131nla\n    this.emit('userRegistered', { username: kullaniciAdi, timestamp: new Date() });\n  }\n\n  sifreSifirla(kullaniciAdi) {\n    \/\/ \u015eifre s\u0131f\u0131rlama mant\u0131\u011f\u0131...\n    console.log(<code>${kullaniciAdi} kullan\u0131c\u0131s\u0131n\u0131n \u015fifresi s\u0131f\u0131rlan\u0131yor...<\/code>);\n    this.emit('passwordReset', { username: kullaniciAdi, timestamp: new Date() });\n  }\n}\n\nmodule.exports = UserManager;\n\n\/\/ app.js (Ana uygulama dosyas\u0131)\nconst UserManager = require('.\/userManager');\nconst userManager = new UserManager();\n\n\/\/ Kullan\u0131c\u0131 kay\u0131t olay\u0131n\u0131 dinle\nuserManager.on('userRegistered', (userData) => {\n  console.log(<code>[LOG] Yeni kullan\u0131c\u0131 kaydoldu: ${userData.username} - ${userData.timestamp}<\/code>);\n  \/\/ E-posta g\u00f6nderme, ho\u015f geldin mesaj\u0131 gibi i\u015flemler yap\u0131labilir\n});\n\n\/\/ \u015eifre s\u0131f\u0131rlama olay\u0131n\u0131 dinle\nuserManager.on('passwordReset', (userData) => {\n  console.log(<code>[ALERT] ${userData.username} kullan\u0131c\u0131s\u0131n\u0131n \u015fifresi s\u0131f\u0131rland\u0131! - ${userData.timestamp}<\/code>);\n  \/\/ Y\u00f6neticilere bildirim g\u00f6nderme gibi i\u015flemler yap\u0131labilir\n});\n\n\/\/ Kullan\u0131c\u0131 i\u015flemleri\nuserManager.kayitOl('denemeKullanici', 'parola123');\nuserManager.sifreSifirla('denemeKullanici');\n<\/code><\/pre>\n<h3>2. Uzun S\u00fcreli \u0130\u015flemlerin Durumunu Bildirme<\/h3>\n<p>Bir dosya y\u00fckleme, veri i\u015fleme veya API \u00e7a\u011fr\u0131s\u0131 gibi uzun s\u00fcren i\u015flemlerin ilerlemesini veya tamamlanmas\u0131n\u0131 bildirmek i\u00e7in Event Emitter kullanabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\n\nclass DataProcessor extends EventEmitter {\n  constructor() {\n    super();\n  }\n\n  processData(data) {\n    this.emit('processingStarted', data.length);\n    console.log(<code>Veri i\u015fleme ba\u015flad\u0131, ${data.length} \u00f6\u011fe.<\/code>);\n\n    let processedCount = 0;\n    for (let i = 0; i < data.length; i++) {\n      \/\/ Yo\u011fun i\u015flem sim\u00fclasyonu\n      setTimeout(() => {\n        processedCount++;\n        this.emit('progress', processedCount \/ data.length * 100);\n        if (processedCount === data.length) {\n          this.emit('processingComplete', 'T\u00fcm veri ba\u015far\u0131yla i\u015flendi.');\n        }\n      }, i * 10); \/\/ Her \u00f6\u011fe i\u00e7in k\u00fc\u00e7\u00fck bir gecikme\n    }\n  }\n}\n\nconst processor = new DataProcessor();\n\nprocessor.on('processingStarted', (totalItems) => {\n  console.log(<code>Toplam ${totalItems} \u00f6\u011fe i\u015flenecek.<\/code>);\n});\n\nprocessor.on('progress', (percentage) => {\n  console.log(<code>\u0130lerleme: ${percentage.toFixed(2)}%<\/code>);\n});\n\nprocessor.on('processingComplete', (message) => {\n  console.log(<code>\u0130\u015flem Bitti: ${message}<\/code>);\n});\n\nprocessor.on('error', (err) => {\n  console.error('Veri i\u015fleme s\u0131ras\u0131nda hata:', err.message);\n});\n\n\/\/ \u0130\u015flenecek \u00f6rnek veri\nconst myData = Array.from({ length: 20 }, (_, i) => <code>item-${i + 1}<\/code>);\nprocessor.processData(myData);\n<\/code><\/pre>\n<h3>3. Durum De\u011fi\u015fikliklerini \u0130zleme<\/h3>\n<p>Bir nesnenin dahili durumundaki de\u011fi\u015fiklikleri d\u0131\u015far\u0131ya bildirmek i\u00e7in Event Emitter&#8217;lar kullan\u0131labilir.<\/p>\n<pre><code class=\"language-javascript\">\nconst EventEmitter = require('events');\n\nclass LightSwitch extends EventEmitter {\n  constructor() {\n    super();\n    this.isOn = false;\n  }\n\n  toggle() {\n    this.isOn = !this.isOn;\n    if (this.isOn) {\n      this.emit('turnedOn');\n    } else {\n      this.emit('turnedOff');\n    }\n    this.emit('stateChanged', this.isOn ? 'A\u00c7IK' : 'KAPALI');\n  }\n\n  getState() {\n    return this.isOn;\n  }\n}\n\nconst livingRoomLight = new LightSwitch();\n\nlivingRoomLight.on('turnedOn', () => {\n  console.log('Oturma odas\u0131 \u0131\u015f\u0131\u011f\u0131 a\u00e7\u0131ld\u0131.');\n});\n\nlivingRoomLight.on('turnedOff', () => {\n  console.log('Oturma odas\u0131 \u0131\u015f\u0131\u011f\u0131 kapat\u0131ld\u0131.');\n});\n\nlivingRoomLight.on('stateChanged', (newState) => {\n  console.log(<code>I\u015f\u0131\u011f\u0131n yeni durumu: ${newState}<\/code>);\n});\n\nlivingRoomLight.toggle(); \/\/ I\u015f\u0131\u011f\u0131 a\u00e7ar\nlivingRoomLight.toggle(); \/\/ I\u015f\u0131\u011f\u0131 kapat\u0131r\nlivingRoomLight.toggle(); \/\/ I\u015f\u0131\u011f\u0131 tekrar a\u00e7ar\n<\/code><\/pre>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Event Emitter&#8217;lar, Node.js&#8217;in temel ve g\u00fc\u00e7l\u00fc bir \u00f6zelli\u011fidir. Uygulamalar\u0131n\u0131zda mod\u00fcller aras\u0131 ileti\u015fimi d\u00fczenlemenize, olaylara dayal\u0131 mant\u0131k olu\u015fturman\u0131za ve genel olarak daha \u00f6l\u00e7eklenebilir, bak\u0131m\u0131 kolay ve esnek bir kod taban\u0131 olu\u015fturman\u0131za yard\u0131mc\u0131 olurlar. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, karma\u015f\u0131k sistemlerin anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131rabilir ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rabilirler.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Event Emitter nedir?<\/h4>\n<p>Event Emitter, Node.js&#8217;te &#8220;yay\u0131nla-abone ol&#8221; (publish-subscribe) desenini uygulayan bir mekanizmad\u0131r. Bir olay\u0131n ger\u00e7ekle\u015fti\u011fini duyurur (yay\u0131nlar) ve bu olaya abone olan (dinleyen) fonksiyonlar\u0131n \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Neden Event Emitter kullanmal\u0131y\u0131m?<\/h4>\n<p>Mod\u00fcller aras\u0131 ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 azalt\u0131r (decoupling), kodu daha mod\u00fcler ve esnek hale getirir, asenkron i\u015flemleri y\u00f6netmeye yard\u0131mc\u0131 olur ve uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmlerinin olaylar arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. Node.js&#8217;in bir\u00e7ok dahili mod\u00fcl\u00fc de bu deseni kullan\u0131r.<\/p>\n<h4><code>on()<\/code> ve <code>once()<\/code> metotlar\u0131 aras\u0131ndaki fark nedir?<\/h4>\n<p><code>on()<\/code> metodu, bir olay\u0131 her yay\u0131nland\u0131\u011f\u0131nda dinleyen kal\u0131c\u0131 bir dinleyici ekler. <code>once()<\/code> metodu ise, bir olay\u0131 yaln\u0131zca bir kez dinleyen ve olay ilk kez yay\u0131nland\u0131\u011f\u0131nda otomatik olarak kald\u0131r\u0131lan bir dinleyici ekler.<\/p>\n<h4>Hata olaylar\u0131n\u0131 nas\u0131l ele al\u0131r\u0131m?<\/h4>\n<p>Bir Event Emitter \u00fczerinde <code>'error'<\/code> olay\u0131n\u0131 dinleyerek hatalar\u0131 ele almal\u0131s\u0131n\u0131z. E\u011fer bir <code>'error'<\/code> olay\u0131 yay\u0131nlan\u0131r ve bu olay\u0131 dinleyen hi\u00e7bir fonksiyon yoksa, Node.js s\u00fcreci varsay\u0131lan olarak \u00e7\u00f6ker. Bu nedenle her zaman bir <code>'error'<\/code> dinleyicisi eklemek iyi bir uygulamad\u0131r.<\/p>\n<h4>Event Emitter&#8217;larda bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 nas\u0131l \u00f6nlerim?<\/h4>\n<p>Art\u0131k ihtiya\u00e7 duyulmayan olay dinleyicilerini <code>removeListener()<\/code> veya <code>removeAllListeners()<\/code> metotlar\u0131 ile kald\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun. \u00d6zellikle uzun \u00f6m\u00fcrl\u00fc nesnelerde veya dinamik olarak eklenen\/kald\u0131r\u0131lan bile\u015fenlerde bu \u00f6nemlidir. Ayr\u0131ca, <code>setMaxListeners()<\/code> ile dinleyici say\u0131s\u0131n\u0131 kontrol alt\u0131nda tutarak olas\u0131 s\u0131z\u0131nt\u0131lar\u0131 erkenden fark edebilirsiniz.<\/p>\n<h4>Event Emitter senkron mu asenkron mu \u00e7al\u0131\u015f\u0131r?<\/h4>\n<p><code>emit()<\/code> \u00e7a\u011fr\u0131s\u0131 senkron olarak \u00e7al\u0131\u015f\u0131r, yani olay yay\u0131nland\u0131\u011f\u0131nda t\u00fcm dinleyiciler hemen s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Ancak, dinleyici fonksiyonlar\u0131n\u0131n i\u00e7inde asenkron i\u015flemler (\u00f6rne\u011fin <code>setTimeout<\/code>, Promise&#8217;ler) olabilir. E\u011fer olay\u0131n yay\u0131nlanmas\u0131n\u0131 tamamen asenkron hale getirmek isterseniz, dinleyici fonksiyonlar\u0131n\u0131z\u0131n i\u00e7inde <code>process.nextTick()<\/code> veya <code>setImmediate()<\/code> kullanabilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js, asenkron ve olay tabanl\u0131 mimarisiyle bilinen g\u00fc\u00e7l\u00fc bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Bu mimarinin temel ta\u015flar\u0131ndan biri de Event E","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-35611","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Event Emitter Nedir ve Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Node.js, asenkron ve olay tabanl\u0131 mimarisiyle bilinen g\u00fc\u00e7l\u00fc bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Bu mimarinin temel ta\u015flar\u0131ndan biri de Event E\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-01T15:41:37+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?\",\"datePublished\":\"2025-12-01T15:41:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\"},\"wordCount\":1396,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\",\"name\":\"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-01T15:41:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?","og_description":"Node.js, asenkron ve olay tabanl\u0131 mimarisiyle bilinen g\u00fc\u00e7l\u00fc bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Bu mimarinin temel ta\u015flar\u0131ndan biri de Event E","og_url":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-01T15:41:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?","datePublished":"2025-12-01T15:41:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/"},"wordCount":1396,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/","url":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/","name":"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-01T15:41:37+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/event-emitter-nedir-ve-neden-kullanilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Event Emitter Nedir ve Neden Kullan\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35611"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35611\/revisions"}],"predecessor-version":[{"id":35612,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35611\/revisions\/35612"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}