{"id":43453,"date":"2026-07-19T17:01:17","date_gmt":"2026-07-19T14:01:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=43453"},"modified":"2026-07-19T17:01:43","modified_gmt":"2026-07-19T14:01:43","slug":"rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/","title":{"rendered":"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek"},"content":{"rendered":"<h2>RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek<\/h2>\n<p>Modern web uygulamalar\u0131 geli\u015ftirmek, asenkron veri ak\u0131\u015flar\u0131n\u0131 ve kullan\u0131c\u0131 etkile\u015fimlerini verimli bir \u015fekilde y\u00f6netmeyi gerektirir. Angular ba\u015fta olmak \u00fczere bir\u00e7ok modern JavaScript ekosisteminde, bu asenkron s\u00fcre\u00e7leri y\u00f6netmek i\u00e7in RxJS (Reactive Extensions for JavaScript) k\u00fct\u00fcphanesi yayg\u0131n olarak kullan\u0131l\u0131r. RxJS, reaktif programlama felsefesini benimseyerek karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netilebilir hale getirir. Ancak, reaktif programlaman\u0131n getirdi\u011fi b\u00fcy\u00fck g\u00fc\u00e7, beraberinde \u00f6nemli bir sorumluluk da getirir: Aboneliklerin (Subscriptions) do\u011fru y\u00f6netilmesi.<\/p>\n<p>Bir Observable ak\u0131\u015f\u0131na abone (subscribe) oldu\u011fumuzda, bu ak\u0131\u015f t\u00fcketilmeyi bekleyen s\u00fcrekli bir veri kayna\u011f\u0131 haline gelir. E\u011fer bu abonelikleri i\u015fimiz bitti\u011finde sonland\u0131rmazsak, uygulaman\u0131n arka plan\u0131nda \u00e7al\u0131\u015fmaya devam ederler. Bu durum, &#8220;Bellek S\u0131z\u0131nt\u0131s\u0131&#8221; (Memory Leak) olarak adland\u0131r\u0131lan ve uygulaman\u0131n performans\u0131n\u0131 zamanla d\u00fc\u015f\u00fcren, hatta taray\u0131c\u0131n\u0131n \u00e7\u00f6kmesine neden olabilen ciddi sorunlara yol a\u00e7ar. Bu makalede, RxJS aboneliklerini y\u00f6netmenin en temiz, en g\u00fcvenli ve deklaratif yolu olan <code>takeUntil<\/code> operat\u00f6r\u00fcn\u00fc derinlemesine inceleyece\u011fiz.<\/p>\n<h3>Bellek S\u0131z\u0131nt\u0131s\u0131 (Memory Leak) Nedir ve Neden Olu\u015fur?<\/h3>\n<p>JavaScript motorlar\u0131 (\u00f6rne\u011fin Google Chrome&#8217;un V8 motoru), art\u0131k ihtiya\u00e7 duyulmayan bellek alanlar\u0131n\u0131 temizlemek i\u00e7in &#8220;Garbage Collector&#8221; (\u00c7\u00f6p Toplay\u0131c\u0131) mekanizmas\u0131n\u0131 kullan\u0131r. Garbage Collector, bellekteki bir nesneye eri\u015filebilecek aktif bir referans kalmad\u0131\u011f\u0131nda o nesneyi bellekten siler.<\/p>\n<p>Ancak, bir Angular bile\u015feni (component) i\u00e7inde global bir servise veya s\u00fcrekli veri \u00fcreten bir Observable ak\u0131\u015f\u0131na (\u00f6rne\u011fin <code>Interval<\/code>, <code>fromEvent<\/code> veya bir Store se\u00e7ici) abone oldu\u011fumuzda, bu abonelik bile\u015fenin kendisinden ba\u011f\u0131ms\u0131z bir ya\u015fam d\u00f6ng\u00fcs\u00fcne sahip olur. Bile\u015fen yok edildi\u011finde (kullan\u0131c\u0131 ba\u015fka bir sayfaya ge\u00e7ti\u011finde), e\u011fer abonelik aktif kalmaya devam ederse, abonelik i\u00e7indeki geri \u00e7a\u011f\u0131r\u0131m fonksiyonu (callback) hala bile\u015fenin \u00f6zelliklerine (<code>this<\/code> ba\u011flam\u0131na) referans veriyor olacakt\u0131r. Garbage Collector, bu referans nedeniyle bile\u015fenin bellekte kaplad\u0131\u011f\u0131 alan\u0131 temizleyemez. Kullan\u0131c\u0131 sayfaya her geri d\u00f6nd\u00fc\u011f\u00fcnde yeni bir abonelik olu\u015fturulur ve eski abonelikler de arka planda \u00e7al\u0131\u015fmaya devam eder. Bu durum belle\u011fin \u015fi\u015fmesine ve uygulaman\u0131n yava\u015flamas\u0131na neden olur.<\/p>\n<h3>\u0130mperatif Yakla\u015f\u0131m: Manuel Abonelik Y\u00f6netimi<\/h3>\n<p>Abonelikleri sonland\u0131rman\u0131n en temel yolu, her abonelikten d\u00f6nen <code>Subscription<\/code> nesnesini saklamak ve bile\u015fen yok edilirken bu nesne \u00fczerinde <code>unsubscribe()<\/code> metodunu \u00e7a\u011f\u0131rmakt\u0131r. Bu yakla\u015f\u0131ma &#8220;\u0130mperatif&#8221; (Emredici) yakla\u015f\u0131m denir, \u00e7\u00fcnk\u00fc bilgisayara her ad\u0131m\u0131 tek tek ne zaman ve nas\u0131l yapaca\u011f\u0131n\u0131 s\u00f6yleriz.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, manuel abonelik y\u00f6netiminin nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz:<\/p>\n<pre><code class=\"language-typescript\">\nimport { Component, OnInit, OnDestroy } from '@angular\/core';\nimport { interval, Subscription } from 'rxjs';\n\n@Component({\n  selector: 'app-manual-subscription',\n  template: '&lt;p&gt;Saya\u00e7: {{ counter }}&lt;\/p&gt;'\n})\nexport class ManualSubscriptionComponent implements OnInit, OnDestroy {\n  counter = 0;\n  private mySubscription: Subscription | null = null;\n\n  ngOnInit() {\n    this.mySubscription = interval(1000).subscribe(value => {\n      this.counter = value;\n      console.log('Saya\u00e7 \u00e7al\u0131\u015f\u0131yor:', value);\n    });\n  }\n\n  ngOnDestroy() {\n    if (this.mySubscription) {\n      this.mySubscription.unsubscribe();\n      console.log('Abonelik manuel olarak sonland\u0131r\u0131ld\u0131.');\n    }\n  }\n}\n<\/code><\/pre>\n<p>Bu y\u00f6ntem k\u00fc\u00e7\u00fck bile\u015fenlerde i\u015fe yarasa da, ger\u00e7ek d\u00fcnya senaryolar\u0131nda h\u0131zl\u0131ca s\u00fcrd\u00fcr\u00fclemez hale gelir. Birden fazla aboneli\u011finiz oldu\u011funda, her biri i\u00e7in ayr\u0131 de\u011fi\u015fkenler tan\u0131mlaman\u0131z, bunlar\u0131 bir dizide toplaman\u0131z veya <code>Subscription<\/code> s\u0131n\u0131f\u0131n\u0131n <code>add()<\/code> metodunu kullanarak birle\u015ftirmeniz gerekir. Bu durum, kod taban\u0131n\u0131zda \u00e7ok fazla &#8220;boilerplate&#8221; (\u015fablon\/gereksiz) kod olu\u015fmas\u0131na yol a\u00e7ar. Ayr\u0131ca, geli\u015ftiricinin <code>ngOnDestroy<\/code> i\u00e7inde bir aboneli\u011fi iptal etmeyi unutmas\u0131 \u00e7ok kolayd\u0131r.<\/p>\n<h3>Deklaratif Yakla\u015f\u0131m: takeUntil Operat\u00f6r\u00fc<\/h3>\n<p>Deklaratif (Tan\u0131mlay\u0131c\u0131) programlama, &#8220;nas\u0131l yap\u0131laca\u011f\u0131n\u0131&#8221; de\u011fil, &#8220;ne yap\u0131laca\u011f\u0131n\u0131&#8221; tan\u0131mlamaya odaklan\u0131r. RxJS&#8217;in sundu\u011fu <code>takeUntil<\/code> operat\u00f6r\u00fc, abonelik y\u00f6netimini deklaratif hale getirmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<p><code>takeUntil<\/code>, kaynak Observable ak\u0131\u015f\u0131n\u0131 dinler ve kendisine parametre olarak verilen ikinci bir &#8220;tetikleyici&#8221; (notifier) Observable veri yayana (emit) kadar bu ak\u0131\u015f\u0131 a\u00e7\u0131k tutar. Tetikleyici Observable bir de\u011fer yayd\u0131\u011f\u0131 anda, <code>takeUntil<\/code> kaynak Observable ak\u0131\u015f\u0131n\u0131 otomatik olarak tamamlar (complete) ve aboneli\u011fi sonland\u0131r\u0131r.<\/p>\n<p>Bu yakla\u015f\u0131m sayesinde, aboneli\u011fin ne zaman sonlanaca\u011f\u0131n\u0131 do\u011frudan ak\u0131\u015f\u0131n (pipe) i\u00e7inde tan\u0131mlar\u0131z. B\u00f6ylece bile\u015fenin ya\u015fam d\u00f6ng\u00fcs\u00fc ile veri ak\u0131\u015f\u0131n\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc deklaratif bir \u015fekilde birbirine ba\u011flam\u0131\u015f oluruz.<\/p>\n<h3>takeUntil ile Abonelik Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p><code>takeUntil<\/code> operat\u00f6r\u00fcn\u00fc Angular bile\u015fenlerinde kullan\u0131rken standart bir tasar\u0131m kal\u0131b\u0131 (pattern) uygulan\u0131r. Bu kal\u0131p \u00fc\u00e7 temel ad\u0131mdan olu\u015fur:<\/p>\n<ul>\n<li><strong>Bir Tetikleyici Subject Tan\u0131mlamak:<\/strong> Genellikle <code>destroy$<\/code> ad\u0131nda \u00f6zel bir <code>Subject&lt;void&gt;<\/code> tan\u0131mlan\u0131r.<\/li>\n<li><strong>takeUntil Operat\u00f6r\u00fcn\u00fc Zincire Eklemek:<\/strong> \u0130lgili Observable ak\u0131\u015f\u0131n\u0131n <code>pipe<\/code> fonksiyonu i\u00e7ine <code>takeUntil(this.destroy$)<\/code> eklenir.<\/li>\n<li><strong>Ya\u015fam D\u00f6ng\u00fcs\u00fc Biti\u015finde Tetiklemek:<\/strong> Bile\u015fenin yok edilme an\u0131nda (<code>ngOnDestroy<\/code>), <code>destroy$<\/code> Subject&#8217;i \u00fczerinden veri yay\u0131l\u0131r ve tamamlan\u0131r.<\/li>\n<\/ul>\n<p>\u015eimdi bu ad\u0131mlar\u0131 kod \u00fczerinde uygulayal\u0131m:<\/p>\n<pre><code class=\"language-typescript\">\nimport { Component, OnInit, OnDestroy } from '@angular\/core';\nimport { interval, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs\/operators';\n\n@Component({\n  selector: 'app-declarative-subscription',\n  template: '&lt;p&gt;Saya\u00e7: {{ counter }}&lt;\/p&gt;'\n})\nexport class DeclarativeSubscriptionComponent implements OnInit, OnDestroy {\n  counter = 0;\n  \/\/ 1. Tetikleyici Subject tan\u0131mlan\u0131yor\n  private destroy$ = new Subject&lt;void&gt;();\n\n  ngOnInit() {\n    interval(1000)\n      .pipe(\n        \/\/ 2. takeUntil operat\u00f6r\u00fc ak\u0131\u015fa ekleniyor\n        takeUntil(this.destroy$)\n      )\n      .subscribe({\n        next: (value) => {\n          this.counter = value;\n          console.log('Deklaratif saya\u00e7:', value);\n        },\n        complete: () => {\n          console.log('Ak\u0131\u015f ba\u015far\u0131yla tamamland\u0131.');\n        }\n      });\n  }\n\n  ngOnDestroy() {\n    \/\/ 3. Bile\u015fen yok edilirken tetikleyici \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n}\n<\/code><\/pre>\n<p>Bu kodda neler oldu\u011funu ad\u0131m ad\u0131m inceleyelim:<\/p>\n<p>\u0130lk olarak, <code>destroy$<\/code> ad\u0131nda bir RxJS <code>Subject<\/code> olu\u015fturduk. Subject&#8217;ler hem bir Observable hem de bir Observer gibi davranabilirler, yani hem veri yayabilirler hem de dinlenebilirler. T\u00fcr\u00fcn\u00fc <code>void<\/code> olarak belirledik \u00e7\u00fcnk\u00fc yayaca\u011f\u0131 de\u011ferin kendisiyle de\u011fil, sadece yay\u0131lma an\u0131 (event) ile ilgileniyoruz.<\/p>\n<p>\u0130kinci ad\u0131mda, <code>interval(1000)<\/code> ak\u0131\u015f\u0131na <code>pipe<\/code> kullanarak <code>takeUntil(this.destroy$)<\/code> operat\u00f6r\u00fcn\u00fc uygulad\u0131k. Bu, RxJS&#8217;e \u015fu talimat\u0131 verir: &#8220;Bana her saniye bir say\u0131 g\u00f6nder, ta ki <code>destroy$<\/code> nesnesi bir de\u011fer yayana kadar. O an geldi\u011finde bu ak\u0131\u015f\u0131 kapat.&#8221;<\/p>\n<p>Son olarak, Angular bile\u015feni ekran d\u0131\u015f\u0131na \u00e7\u0131kt\u0131\u011f\u0131nda ve yok edildi\u011finde <code>ngOnDestroy<\/code> metodu otomatik olarak tetiklenir. Burada <code>this.destroy$.next()<\/code> diyerek tetikleyiciyi ate\u015fleriz. Bu sinyal <code>takeUntil<\/code> operat\u00f6r\u00fcne ula\u015f\u0131r, operat\u00f6r kaynak ak\u0131\u015f\u0131 kapat\u0131r ve abonelik g\u00fcvenli bir \u015fekilde sonland\u0131r\u0131l\u0131r. Hemen ard\u0131ndan <code>this.destroy$.complete()<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak tetikleyicinin kendisini de bellekten temizleriz.<\/p>\n<h3>Operat\u00f6rlerin S\u0131ralamas\u0131 Neden \u00d6nemlidir?<\/h3>\n<p>RxJS kullan\u0131rken yap\u0131lan en yayg\u0131n hatalardan biri, <code>takeUntil<\/code> operat\u00f6r\u00fcn\u00fc <code>pipe<\/code> zinciri i\u00e7inde yanl\u0131\u015f yere konumland\u0131rmakt\u0131r. RxJS operat\u00f6rleri yukar\u0131dan a\u015fa\u011f\u0131ya (veya soldan sa\u011fa) s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131r. Bu nedenle, <code>takeUntil<\/code> operat\u00f6r\u00fcn\u00fcn zincirdeki konumu davran\u0131\u015f\u0131n\u0131 do\u011frudan etkiler.<\/p>\n<p><strong>Alt\u0131n Kural:<\/strong> Genel bir kural olarak, <code>takeUntil<\/code> operat\u00f6r\u00fc her zaman <code>pipe<\/code> zincirindeki <strong>en son<\/strong> operat\u00f6r olmal\u0131d\u0131r.<\/p>\n<p>Bunun nedenini anlamak i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyelim:<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ YANLI\u015e KULLANIM\nsource$.pipe(\n  takeUntil(this.destroy$),\n  switchMap(data =&gt; this.http.get(<code>\/api\/data\/${data}<\/code>))\n).subscribe();\n<\/code><\/pre>\n<p>Yukar\u0131daki yanl\u0131\u015f kullan\u0131mda, <code>takeUntil<\/code> operat\u00f6r\u00fc <code>switchMap<\/code>&#8216;ten \u00f6nce yer almaktad\u0131r. E\u011fer <code>destroy$<\/code> sinyal g\u00f6nderirse, <code>source$<\/code> ak\u0131\u015f\u0131 sonlan\u0131r. Ancak, e\u011fer <code>switchMap<\/code> i\u00e7indeki HTTP iste\u011fi o s\u0131rada hala devam ediyorsa, bu i\u00e7 ak\u0131\u015f (inner observable) tamamlanmayabilir ve bellek s\u0131z\u0131nt\u0131s\u0131na yol a\u00e7abilir. \u00c7\u00fcnk\u00fc <code>takeUntil<\/code> sadece kendisinden \u00f6nceki ak\u0131\u015f\u0131 kontrol edebilir, kendisinden sonra \u00fcretilen i\u00e7 ak\u0131\u015flar\u0131 do\u011frudan sonland\u0131ramaz.<\/p>\n<p>Do\u011fru kullan\u0131m ise \u015fu \u015fekildedir:<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ DO\u011eRU KULLANIM\nsource$.pipe(\n  switchMap(data =&gt; this.http.get(<code>\/api\/data\/${data}<\/code>)),\n  takeUntil(this.destroy$) \/\/ En sonda yer almal\u0131\n).subscribe();\n<\/code><\/pre>\n<p><code>takeUntil<\/code> en sonda yer ald\u0131\u011f\u0131nda, zincirdeki t\u00fcm operat\u00f6rlerin (ve onlar\u0131n \u00fcretti\u011fi i\u00e7 ak\u0131\u015flar\u0131n) \u00e7\u0131kt\u0131s\u0131n\u0131 izler ve tetiklendi\u011fi anda t\u00fcm sistemi tek seferde g\u00fcvenli bir \u015fekilde kapat\u0131r.<\/p>\n<h3>Modern Angular Alternatifi: takeUntilDestroyed<\/h3>\n<p>Angular ekibi, reaktif programlamay\u0131 daha da kolayla\u015ft\u0131rmak amac\u0131yla Angular 16 s\u00fcr\u00fcm\u00fcyle birlikte yeni bir yard\u0131mc\u0131 operat\u00f6r tan\u0131tt\u0131: <code>takeUntilDestroyed<\/code>. Bu operat\u00f6r, yukar\u0131da bahsetti\u011fimiz <code>Subject<\/code> olu\u015fturma ve <code>ngOnDestroy<\/code> i\u00e7inde manuel tetikleme i\u015flemlerini arka planda otomatik olarak ger\u00e7ekle\u015ftirir.<\/p>\n<p><code>takeUntilDestroyed<\/code>, Angular&#8217;\u0131n yeni <code>DestroyRef<\/code> mekanizmas\u0131n\u0131 kullan\u0131r. Bu sayede bile\u015fenin yok edilme an\u0131n\u0131 kendisi takip eder. Kullan\u0131m\u0131 son derece temizdir:<\/p>\n<pre><code class=\"language-typescript\">\nimport { Component, OnInit } from '@angular\/core';\nimport { interval } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular\/core\/rxjs-interop';\n\n@Component({\n  selector: 'app-modern-subscription',\n  template: '&lt;p&gt;Modern Saya\u00e7: {{ counter }}&lt;\/p&gt;'\n})\nexport class ModernSubscriptionComponent implements OnInit {\n  counter = 0;\n\n  constructor() {\n    \/\/ Constructor i\u00e7inde kullan\u0131ld\u0131\u011f\u0131nda ekstra parametreye gerek yoktur\n    interval(1000)\n      .pipe(takeUntilDestroyed())\n      .subscribe(value =&gt; this.counter = value);\n  }\n\n  ngOnInit() {}\n}\n<\/code><\/pre>\n<p>E\u011fer <code>takeUntilDestroyed<\/code> operat\u00f6r\u00fcn\u00fc constructor d\u0131\u015f\u0131nda (\u00f6rne\u011fin <code>ngOnInit<\/code> veya ba\u015fka bir metot i\u00e7inde) kullanmak isterseniz, Angular&#8217;\u0131n enjeksiyon ba\u011flam\u0131na (injection context) eri\u015fmesi gerekir. Bu durumda <code>DestroyRef<\/code> referans\u0131n\u0131 operat\u00f6re manuel olarak ge\u00e7meniz gerekir:<\/p>\n<pre><code class=\"language-typescript\">\nimport { Component, OnInit, inject, DestroyRef } from '@angular\/core';\nimport { interval } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular\/core\/rxjs-interop';\n\n@Component({\n  selector: 'app-modern-init-subscription',\n  template: '&lt;p&gt;Saya\u00e7: {{ counter }}&lt;\/p&gt;'\n})\nexport class ModernInitSubscriptionComponent implements OnInit {\n  counter = 0;\n  private destroyRef = inject(DestroyRef); \/\/ DestroyRef enjekte ediliyor\n\n  ngOnInit() {\n    interval(1000)\n      .pipe(\n        \/\/ Enjeksiyon ba\u011flam\u0131 d\u0131\u015f\u0131nda oldu\u011fu i\u00e7in destroyRef parametre olarak ge\u00e7iliyor\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(value =&gt; this.counter = value);\n  }\n}\n<\/code><\/pre>\n<h3>Hangi Y\u00f6ntemi Se\u00e7melisiniz?<\/h3>\n<p>Uygulaman\u0131zda hangi abonelik y\u00f6netim stratejisini se\u00e7ece\u011finiz, kulland\u0131\u011f\u0131n\u0131z Angular s\u00fcr\u00fcm\u00fcne ve \u00f6zel ihtiya\u00e7lar\u0131n\u0131za ba\u011fl\u0131d\u0131r. A\u015fa\u011f\u0131daki kar\u015f\u0131la\u015ft\u0131rma tablosu karar vermenize yard\u0131mc\u0131 olabilir:<\/p>\n<table border=\"1\" cellpadding=\"10\" cellspacing=\"0\" style=\"width: 100%; border-collapse: collapse; margin-top: 20px; margin-bottom: 20px;\">\n<thead>\n<tr style=\"background-color: #f2f2f2;\">\n<th>Y\u00f6ntem<\/th>\n<th>Avantajlar\u0131<\/th>\n<th>Dezavantajlar\u0131<\/th>\n<th>En Uygun Kullan\u0131m Senaryosu<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Manuel unsubscribe()<\/strong><\/td>\n<td>Ekstra RxJS operat\u00f6r\u00fc gerektirmez, anla\u015f\u0131lmas\u0131 basittir.<\/td>\n<td>\u00c7ok fazla boilerplate kod \u00fcretir, hata yapmaya (unutulmaya) \u00e7ok m\u00fcsaittir.<\/td>\n<td>Yaln\u0131zca tek bir aboneli\u011fin oldu\u011fu \u00e7ok basit ve k\u00fc\u00e7\u00fck bile\u015fenler.<\/td>\n<\/tr>\n<tr>\n<td><strong>takeUntil Operat\u00f6r\u00fc<\/strong><\/td>\n<td>Deklaratiftir, t\u00fcm abonelikleri tek bir Subject ile y\u00f6netir, g\u00fcvenlidir.<\/td>\n<td>Bile\u015fene OnDestroy eklenmesini ve Subject tan\u0131mlanmas\u0131n\u0131 gerektirir.<\/td>\n<td>Angular 15 ve alt\u0131 s\u00fcr\u00fcmler ile Angular d\u0131\u015f\u0131 saf RxJS projeleri.<\/td>\n<\/tr>\n<tr>\n<td><strong>takeUntilDestroyed<\/strong><\/td>\n<td>S\u0131f\u0131r boilerplate kod, en modern ve temiz yakla\u015f\u0131md\u0131r. Arka plan\u0131 otomatik y\u00f6netir.<\/td>\n<td>Angular 16+ gerektirir. Constructor d\u0131\u015f\u0131nda DestroyRef ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 vard\u0131r.<\/td>\n<td>Angular 16 ve \u00fczeri s\u00fcr\u00fcmlerdeki t\u00fcm yeni bile\u015fenler ve servisler.<\/td>\n<\/tr>\n<tr>\n<td><strong>Async Pipe (| async)<\/strong><\/td>\n<td>Manuel abonelik gerektirmez, \u015fablon (template) d\u00fczeyinde otomatik temizlik sa\u011flar.<\/td>\n<td>Sadece HTML \u015fablonu i\u00e7inde kullan\u0131labilir, TypeScript kod bloklar\u0131nda do\u011frudan eri\u015fim sa\u011flamaz.<\/td>\n<td>Verinin sadece HTML \u015fablonunda g\u00f6sterilece\u011fi durumlar (En ideal y\u00f6ntemdir).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>S\u0131k Yap\u0131lan Hatalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p><code>takeUntil<\/code> g\u00fc\u00e7l\u00fc bir operat\u00f6rd\u00fcr, ancak yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda beklenmedik hatalara veya yine bellek s\u0131z\u0131nt\u0131lar\u0131na yol a\u00e7abilir. \u0130\u015fte ka\u00e7\u0131nman\u0131z gereken baz\u0131 yayg\u0131n hatalar:<\/p>\n<h4>1. Subject&#8217;i &#8220;complete&#8221; Etmeyi Unutmak<\/h4>\n<p><code>ngOnDestroy<\/code> i\u00e7inde <code>this.destroy$.next()<\/code> \u00e7a\u011f\u0131rmak ak\u0131\u015flar\u0131 sonland\u0131r\u0131r, ancak <code>destroy$<\/code> Subject&#8217;inin kendisi hala bellekte a\u00e7\u0131k kal\u0131r. E\u011fer bu Subject&#8217;i kapatmazsan\u0131z, \u00e7ok k\u00fc\u00e7\u00fck de olsa bir bellek s\u0131z\u0131nt\u0131s\u0131 riski devam eder. Bu y\u00fczden her zaman <code>complete()<\/code> metodunu da \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z:<\/p>\n<pre><code class=\"language-typescript\">\nngOnDestroy() {\n  this.destroy$.next();\n  this.destroy$.complete(); \/\/ Bunu asla unutmay\u0131n!\n}\n<\/code><\/pre>\n<h4>2. Singleton Servislerde takeUntil Kullan\u0131m\u0131<\/h4>\n<p>E\u011fer bir Angular servisi <code>providedIn: 'root'<\/code> olarak tan\u0131mlanm\u0131\u015fsa, bu servis bir &#8220;Singleton&#8221; d\u0131r. Yani uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca sadece bir kez olu\u015fturulur ve asla yok edilmez. Bu t\u00fcr servislerde <code>takeUntil(this.destroy$)<\/code> kullanmak anlams\u0131zd\u0131r, \u00e7\u00fcnk\u00fc servisin <code>ngOnDestroy<\/code> metodu uygulama kapat\u0131lana kadar asla tetiklenmez. Servislerde abonelik olu\u015ftururken iki kez d\u00fc\u015f\u00fcnmeli ve m\u00fcmk\u00fcnse abonelik yerine do\u011frudan Observable ak\u0131\u015flar\u0131n\u0131 bile\u015fenlere aktarmal\u0131s\u0131n\u0131z.<\/p>\n<h4>3. Birden Fazla Kez Abone Olmak (Over-subscribing)<\/h4>\n<p>Bazen geli\u015ftiriciler hem TypeScript taraf\u0131nda <code>subscribe<\/code> kullan\u0131r hem de ayn\u0131 Observable&#8217;\u0131 HTML taraf\u0131nda <code>async<\/code> pipe ile dinlerler. Bu durum gereksiz yere iki farkl\u0131 abonelik olu\u015fturulmas\u0131na ve API isteklerinin iki kez at\u0131lmas\u0131na yol a\u00e7ar. E\u011fer veriyi sadece ekranda g\u00f6sterecekseniz, TypeScript taraf\u0131nda abone olmay\u0131n; sadece <code>async<\/code> pipe kullan\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>RxJS, asenkron d\u00fcnyay\u0131 y\u00f6netmek i\u00e7in harika bir ara\u00e7 setidir, ancak bellek y\u00f6netimi konusunda geli\u015ftiriciye sorumluluk y\u00fckler. <code>takeUntil<\/code> operat\u00f6r\u00fc, bu sorumlulu\u011fu yerine getirmenin en zarif, deklaratif ve g\u00fcvenli yollar\u0131ndan biridir. Kodunuzu imperatif temizlik i\u015flemlerinden ar\u0131nd\u0131rarak daha okunabilir, bak\u0131m\u0131 kolay ve performansl\u0131 hale getirir.<\/p>\n<p>E\u011fer Angular 16 veya daha yeni bir s\u00fcr\u00fcm kullan\u0131yorsan\u0131z, <code>takeUntilDestroyed<\/code> operat\u00f6r\u00fc ile bu s\u00fcreci daha da k\u0131saltabilirsiniz. Ancak arka plandaki \u00e7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131 kavramak ad\u0131na <code>takeUntil<\/code> operat\u00f6r\u00fcn\u00fcn \u00e7al\u0131\u015fma prensiplerini bilmek her reaktif programlama uzman\u0131 i\u00e7in kritik \u00f6neme sahiptir. Projelerinizde deklaratif abonelik y\u00f6netimini benimseyerek, bellek s\u0131z\u0131nt\u0131s\u0131 endi\u015fesi olmadan g\u00fcvenli ve ak\u0131c\u0131 uygulamalar geli\u015ftirebilirsiniz.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/rxjs-takeuntil-subscription-management\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/rxjs-takeuntil-subscription-management<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131 geli\u015ftirmek, asenkron veri ak\u0131\u015flar\u0131n\u0131 ve kullan\u0131c\u0131 etkile\u015fimlerini verimli bir \u015fekilde y\u00f6netmeyi gerektirir.","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-43453","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>RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek - 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\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirmek, asenkron veri ak\u0131\u015flar\u0131n\u0131 ve kullan\u0131c\u0131 etkile\u015fimlerini verimli bir \u015fekilde y\u00f6netmeyi gerektirir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-19T14:01:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-19T14:01:43+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=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek\",\"datePublished\":\"2026-07-19T14:01:17+00:00\",\"dateModified\":\"2026-07-19T14:01:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\"},\"wordCount\":1851,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\",\"name\":\"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-19T14:01:17+00:00\",\"dateModified\":\"2026-07-19T14:01:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek\"}]},{\"@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":"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek - 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\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/","og_locale":"tr_TR","og_type":"article","og_title":"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek","og_description":"Modern web uygulamalar\u0131 geli\u015ftirmek, asenkron veri ak\u0131\u015flar\u0131n\u0131 ve kullan\u0131c\u0131 etkile\u015fimlerini verimli bir \u015fekilde y\u00f6netmeyi gerektirir.","og_url":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-19T14:01:17+00:00","article_modified_time":"2026-07-19T14:01:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek","datePublished":"2026-07-19T14:01:17+00:00","dateModified":"2026-07-19T14:01:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/"},"wordCount":1851,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/","url":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/","name":"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-19T14:01:17+00:00","dateModified":"2026-07-19T14:01:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/rxjs-takeuntil-operatoru-ile-abonelikleri-deklaratif-olarak-yonetmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"RxJS takeUntil Operat\u00f6r\u00fc ile Abonelikleri Deklaratif Olarak Y\u00f6netmek"}]},{"@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\/43453","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=43453"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43453\/revisions"}],"predecessor-version":[{"id":43455,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43453\/revisions\/43455"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}