{"id":31417,"date":"2025-10-09T19:41:09","date_gmt":"2025-10-09T16:41:09","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31417"},"modified":"2025-10-09T19:41:09","modified_gmt":"2025-10-09T16:41:09","slug":"rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/","title":{"rendered":"RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak"},"content":{"rendered":"<p><body><\/p>\n<h2>RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak<\/h2>\n<p>RxJS, reaktif programlaman\u0131n g\u00fcc\u00fcn\u00fc JavaScript d\u00fcnyas\u0131na ta\u015f\u0131yan, asenkron veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in kapsaml\u0131 bir k\u00fct\u00fcphanedir. Ancak herhangi bir asenkron sistemde oldu\u011fu gibi, RxJS ak\u0131\u015flar\u0131nda da hatalar ka\u00e7\u0131n\u0131lmazd\u0131r. A\u011f isteklerinin ba\u015far\u0131s\u0131z olmas\u0131, veri i\u015fleme s\u0131ras\u0131nda beklenmeyen durumlar veya harici servislerin yan\u0131t vermemesi gibi bir\u00e7ok senaryoda hatalarla kar\u015f\u0131la\u015fabiliriz. Bu t\u00fcr durumlar\u0131 etkili bir \u015fekilde y\u00f6netmek, uygulamalar\u0131m\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131, kullan\u0131c\u0131 deneyimini ve genel g\u00fcvenilirli\u011fini sa\u011flamak i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<p>Bu makalede, RxJS&#8217;teki basit ama g\u00fc\u00e7l\u00fc hata y\u00f6netimi mekanizmalar\u0131n\u0131 derinlemesine inceleyece\u011fiz. Ak\u0131\u015flarda hatalar\u0131n nas\u0131l yay\u0131ld\u0131\u011f\u0131n\u0131, bu hatalar\u0131 yakalamak, kurtarmak ve hatta yeniden denemek i\u00e7in kullanabilece\u011fimiz temel operat\u00f6rleri ve en iyi uygulamalar\u0131 ele alaca\u011f\u0131z. Amac\u0131m\u0131z, RxJS ile geli\u015ftirme yaparken hata y\u00f6netimini bir kabus olmaktan \u00e7\u0131kar\u0131p, ak\u0131\u015flar\u0131n\u0131z\u0131 sa\u011flam ve \u00f6ng\u00f6r\u00fclebilir hale getiren bir ara\u00e7 setine d\u00f6n\u00fc\u015ft\u00fcrmektir.<\/p>\n<h3>RxJS Ak\u0131\u015flar\u0131nda Hatalar\u0131 Anlamak<\/h3>\n<p>RxJS&#8217;te bir <code>Observable<\/code> (g\u00f6zlemlenebilir) \u00fc\u00e7 t\u00fcr bildirim yayabilir: <code>next<\/code> (yeni bir de\u011fer), <code>complete<\/code> (ak\u0131\u015f\u0131n ba\u015far\u0131yla tamamlanmas\u0131) ve <code>error<\/code> (ak\u0131\u015fta bir hata olu\u015fmas\u0131). Bir <code>Observable<\/code> bir <code>error<\/code> bildirimi yayd\u0131\u011f\u0131nda, bu durum ak\u0131\u015f\u0131n sona erdi\u011fi anlam\u0131na gelir. Yani, hata sonras\u0131 <code>Observable<\/code> art\u0131k <code>next<\/code> veya <code>complete<\/code> bildirimi yaymaz. Bu &#8220;ak\u0131\u015f sonland\u0131rma&#8221; davran\u0131\u015f\u0131, hata y\u00f6netimini \u00f6zel k\u0131lar; \u00e7\u00fcnk\u00fc bir hata meydana geldi\u011finde, ak\u0131\u015f varsay\u0131lan olarak durur ve <code>subscribe<\/code> metodunun <code>error<\/code> geri \u00e7a\u011fr\u0131s\u0131 tetiklenir. E\u011fer bu hata yakalanmazsa, genellikle uygulaman\u0131n genel hata i\u015fleyicisi (\u00f6rne\u011fin, taray\u0131c\u0131da <code>window.onerror<\/code> veya Node.js&#8217;te <code>process.on('uncaughtException')<\/code>) taraf\u0131ndan ele al\u0131n\u0131r ve bu durum uygulaman\u0131n beklenmedik bir \u015fekilde \u00e7\u00f6kmesine neden olabilir.<\/p>\n<p>RxJS&#8217;teki hata y\u00f6netimi operat\u00f6rleri, bu varsay\u0131lan ak\u0131\u015f sonland\u0131rma davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmemizi veya bu duruma tepki vermemizi sa\u011flar. Temel ama\u00e7, bir hata meydana geldi\u011finde ak\u0131\u015f\u0131 tamamen durdurmak yerine, ak\u0131\u015f\u0131 kurtarmak, alternatif bir yol sunmak veya i\u015flemi yeniden denemek i\u00e7in bir f\u0131rsat yaratmakt\u0131r.<\/p>\n<h3>Temel Hata Y\u00f6netimi Operat\u00f6rleri<\/h3>\n<p>RxJS, hata y\u00f6netimi i\u00e7in bir dizi g\u00fc\u00e7l\u00fc operat\u00f6r sunar. Bu operat\u00f6rler, farkl\u0131 hata senaryolar\u0131na uygun \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h4><code>catchError<\/code><\/h4>\n<p><code>catchError<\/code>, RxJS&#8217;teki en temel ve en s\u0131k kullan\u0131lan hata y\u00f6netimi operat\u00f6r\u00fcd\u00fcr. Bir kaynak <code>Observable<\/code>&#8216;dan gelen herhangi bir hatay\u0131 yakalar ve bu hatay\u0131 i\u015fleyerek yerine yeni bir <code>Observable<\/code> d\u00f6nd\u00fcrmenize olanak tan\u0131r. Bu sayede, hata durumunda ak\u0131\u015f\u0131n tamamen sonlanmas\u0131n\u0131 engeller ve alternatif bir veri ak\u0131\u015f\u0131 sunar.<\/p>\n<p><strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n<code>catchError<\/code> operat\u00f6r\u00fc, bir hata meydana geldi\u011finde \u00e7a\u011fr\u0131lan bir fonksiyon al\u0131r. Bu fonksiyon iki arg\u00fcman al\u0131r:<br \/>\n1.  <code>error<\/code>: Yakalanan hata nesnesi.<br \/>\n2.  <code>caught<\/code>: Hatay\u0131 yakalayan <code>Observable<\/code>&#8216;\u0131n kendisi. Bu, bazen hatay\u0131 yeniden f\u0131rlatmak veya ba\u015fka bir i\u015flem yapmak i\u00e7in kullan\u0131labilir.<\/p>\n<p>Fonksiyonun, bir <code>Observable<\/code> d\u00f6nd\u00fcrmesi beklenir. Bu d\u00f6nd\u00fcr\u00fclen <code>Observable<\/code>, orijinal ak\u0131\u015f\u0131n yerine ge\u00e7er ve aboneli\u011fi devam ettirir.<\/p>\n<p><strong>\u0130mza:<\/strong><\/p>\n<pre><code class=\"language-typescript\">catchError((error: any, caught: Observable<any>) => ObservableInput<any>)<\/code><\/pre>\n<p><strong>Kullan\u0131m Durumlar\u0131:<\/strong><\/p>\n<p>1.  <strong>Varsay\u0131lan De\u011fer veya Yedek Ak\u0131\u015f D\u00f6nd\u00fcrme:<\/strong> Bir a\u011f iste\u011fi ba\u015far\u0131s\u0131z oldu\u011funda, kullan\u0131c\u0131ya bo\u015f bir dizi veya \u00f6nbellekten al\u0131nm\u0131\u015f veriler gibi bir varsay\u0131lan de\u011fer sunmak isteyebilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">import { of, throwError } from 'rxjs';\n    import { catchError } from 'rxjs\/operators';\n\n    function fetchData(shouldFail: boolean) {\n      return shouldFail ? throwError(() => new Error('Veri y\u00fcklenemedi!')) : of('Ger\u00e7ek Veri');\n    }\n\n    fetchData(true).pipe(\n      catchError(error => {\n        console.error('Hata yakaland\u0131:', error.message);\n        return of('Yedek Veri'); \/\/ Hata durumunda alternatif bir Observable d\u00f6nd\u00fcr\n      })\n    ).subscribe({\n      next: data => console.log('Al\u0131nan Veri:', data),\n      error: err => console.error('Abone hatas\u0131:', err.message), \/\/ Bu k\u0131s\u0131m \u00e7al\u0131\u015fmaz \u00e7\u00fcnk\u00fc hata yakaland\u0131\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131.')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ Hata yakaland\u0131: Veri y\u00fcklenemedi!\n    \/\/ Al\u0131nan Veri: Yedek Veri\n    \/\/ Ak\u0131\u015f tamamland\u0131.<\/code><\/pre>\n<p>2.  <strong>Hatay\u0131 Kaydetme ve Yeniden F\u0131rlatma:<\/strong> Bazen hatay\u0131 kaydetmek (loglamak) ancak yine de ak\u0131\u015f\u0131n sonlanmas\u0131na izin vermek isteyebilirsiniz. Bu durumda, <code>throwError<\/code> operat\u00f6r\u00fcn\u00fc kullanarak hatay\u0131 yeniden f\u0131rlatabilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">import { throwError } from 'rxjs';\n    import { catchError, tap } from 'rxjs\/operators';\n\n    function riskyOperation(shouldFail: boolean) {\n      return shouldFail ? throwError(() => new Error('Kritik Hata!')) : of('Ba\u015far\u0131l\u0131 \u0130\u015flem');\n    }\n\n    riskyOperation(true).pipe(\n      catchError(error => {\n        console.error('Kritik hata logland\u0131:', error.message);\n        return throwError(() => new Error('\u0130\u015flem ba\u015far\u0131s\u0131z oldu: ' + error.message)); \/\/ Hatay\u0131 yeniden f\u0131rlat\n      })\n    ).subscribe({\n      next: data => console.log('Veri:', data),\n      error: err => console.error('Abone hatas\u0131 yakaland\u0131:', err.message),\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131.')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ Kritik hata logland\u0131: Kritik Hata!\n    \/\/ Abone hatas\u0131 yakaland\u0131: \u0130\u015flem ba\u015far\u0131s\u0131z oldu: Kritik Hata!<\/code><\/pre>\n<p>    Bu senaryoda, <code>catchError<\/code> sadece bir yan etki (logging) i\u00e7in kullan\u0131ld\u0131 ve ak\u0131\u015f yine de hata ile sonland\u0131.<\/p>\n<p>3.  <strong>Hata Durumunda Hi\u00e7bir \u015eey Yapmama (Ak\u0131\u015f\u0131 Tamamlama):<\/strong> E\u011fer bir hata durumunda ak\u0131\u015f\u0131n sessizce tamamlanmas\u0131n\u0131 istiyorsan\u0131z, <code>EMPTY<\/code> Observable&#8217;\u0131n\u0131 d\u00f6nd\u00fcrebilirsiniz. Ancak bu, hatan\u0131n g\u00f6z ard\u0131 edildi\u011fi anlam\u0131na geldi\u011fi i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { EMPTY, throwError } from 'rxjs';\n    import { catchError } from 'rxjs\/operators';\n\n    throwError(() => new Error('\u00d6nemli olmayan hata')).pipe(\n      catchError(error => {\n        console.warn('\u00d6nemli olmayan hata yoksay\u0131ld\u0131:', error.message);\n        return EMPTY; \/\/ Ak\u0131\u015f\u0131 tamamla, hi\u00e7bir de\u011fer yayma\n      })\n    ).subscribe({\n      next: data => console.log('Veri:', data),\n      error: err => console.error('Abone hatas\u0131:', err.message),\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131 (EMPTY).')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ \u00d6nemli olmayan hata yoksay\u0131ld\u0131: \u00d6nemli olmayan hata\n    \/\/ Ak\u0131\u015f tamamland\u0131 (EMPTY).<\/code><\/pre>\n<h4><code>retry<\/code><\/h4>\n<p><code>retry<\/code> operat\u00f6r\u00fc, bir hata meydana geldi\u011finde kaynak <code>Observable<\/code>&#8216;a belirli say\u0131da yeniden abone olmaya \u00e7al\u0131\u015f\u0131r. Bu, \u00f6zellikle ge\u00e7ici a\u011f hatalar\u0131 veya k\u0131sa s\u00fcreli servis kesintileri gibi durumlarda olduk\u00e7a faydal\u0131d\u0131r.<\/p>\n<p><strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n<code>retry<\/code> operat\u00f6r\u00fc, bir say\u0131 veya yap\u0131land\u0131rma nesnesi alabilir. Say\u0131 belirtilirse, o kadar kez yeniden deneme yapar. Yap\u0131land\u0131rma nesnesi ile gecikme, karar verme fonksiyonu gibi daha geli\u015fmi\u015f se\u00e7enekler sunar.<\/p>\n<p><strong>\u0130mza:<\/strong><\/p>\n<pre><code class=\"language-typescript\">retry(count?: number | RetryConfig)<\/code><\/pre>\n<p><strong>Kullan\u0131m Durumlar\u0131:<\/strong><\/p>\n<p>1.  <strong>Belirli Say\u0131da Yeniden Deneme:<\/strong> Bir operasyonun 3 kez yeniden denenmesini sa\u011flamak.<\/p>\n<pre><code class=\"language-typescript\">import { timer, throwError } from 'rxjs';\n    import { mergeMap, retry, tap } from 'rxjs\/operators';\n\n    let attemptCount = 0;\n\n    function unstableService() {\n      return timer(1000).pipe( \/\/ 1 saniye sonra de\u011fer yay\n        mergeMap(() => {\n          attemptCount++;\n          if (attemptCount < 3) {\n            console.log(<code>Deneme ${attemptCount}: Hata olu\u015ftu, yeniden deniyor...<\/code>);\n            return throwError(() => new Error('Ge\u00e7ici servis hatas\u0131'));\n          } else {\n            console.log(<code>Deneme ${attemptCount}: Ba\u015far\u0131l\u0131!<\/code>);\n            return of('Servis Verisi');\n          }\n        })\n      );\n    }\n\n    unstableService().pipe(\n      retry(2) \/\/ Toplamda 1 orijinal deneme + 2 yeniden deneme = 3 deneme\n    ).subscribe({\n      next: data => console.log('Al\u0131nan Veri:', data),\n      error: err => console.error('Abone hatas\u0131:', err.message),\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131.')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ Deneme 1: Hata olu\u015ftu, yeniden deniyor...\n    \/\/ Deneme 2: Hata olu\u015ftu, yeniden deniyor...\n    \/\/ Deneme 3: Ba\u015far\u0131l\u0131!\n    \/\/ Al\u0131nan Veri: Servis Verisi\n    \/\/ Ak\u0131\u015f tamamland\u0131.<\/code><\/pre>\n<p>2.  <strong>Gecikmeli Yeniden Deneme:<\/strong> Hata durumunda hemen yeniden denemek yerine, belirli bir s\u00fcre bekledikten sonra yeniden denemek isteyebilirsiniz. Bu, sunucunun kendini toparlamas\u0131 i\u00e7in zaman tan\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { timer, throwError, of } from 'rxjs';\n    import { mergeMap, retry, tap } from 'rxjs\/operators';\n\n    let attemptCountWithDelay = 0;\n\n    function unstableServiceWithDelay() {\n      return timer(500).pipe( \/\/ 0.5 saniye sonra de\u011fer yay\n        mergeMap(() => {\n          attemptCountWithDelay++;\n          if (attemptCountWithDelay < 3) {\n            console.log(<code>Gecikmeli Deneme ${attemptCountWithDelay}: Hata olu\u015ftu.<\/code>);\n            return throwError(() => new Error('Ge\u00e7ici servis hatas\u0131 (gecikmeli)'));\n          } else {\n            console.log(<code>Gecikmeli Deneme ${attemptCountWithDelay}: Ba\u015far\u0131l\u0131!<\/code>);\n            return of('Gecikmeli Servis Verisi');\n          }\n        })\n      );\n    }\n\n    unstableServiceWithDelay().pipe(\n      retry({\n        count: 2, \/\/ Toplamda 3 deneme\n        delay: 1000 \/\/ Her yeniden deneme \u00f6ncesi 1 saniye bekle\n      })\n    ).subscribe({\n      next: data => console.log('Al\u0131nan Veri (gecikmeli):', data),\n      error: err => console.error('Abone hatas\u0131 (gecikmeli):', err.message),\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131 (gecikmeli).')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ Gecikmeli Deneme 1: Hata olu\u015ftu.\n    \/\/ (1 saniye bekleme)\n    \/\/ Gecikmeli Deneme 2: Hata olu\u015ftu.\n    \/\/ (1 saniye bekleme)\n    \/\/ Gecikmeli Deneme 3: Ba\u015far\u0131l\u0131!\n    \/\/ Al\u0131nan Veri (gecikmeli): Gecikmeli Servis Verisi\n    \/\/ Ak\u0131\u015f tamamland\u0131 (gecikmeli).<\/code><\/pre>\n<h4><code>retryWhen<\/code><\/h4>\n<p><code>retryWhen<\/code> operat\u00f6r\u00fc, <code>retry<\/code>&#8216;dan daha geli\u015fmi\u015f yeniden deneme stratejileri olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Bir hata meydana geldi\u011finde ne zaman ve nas\u0131l yeniden denenece\u011fine dair \u00f6zel bir mant\u0131k uygulaman\u0131za olanak tan\u0131r. Genellikle \u00fcstel geri \u00e7ekilme (exponential backoff) gibi karma\u015f\u0131k senaryolar i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n<code>retryWhen<\/code>, bir fonksiyon al\u0131r. Bu fonksiyon, bir hata ak\u0131\u015f\u0131 (<code>Observable<any><\/code>) al\u0131r ve yeniden deneme sinyali veren bir <code>Observable<\/code> d\u00f6nd\u00fcr\u00fcr. Bu d\u00f6nd\u00fcr\u00fclen <code>Observable<\/code> bir de\u011fer yayd\u0131\u011f\u0131nda yeniden deneme tetiklenir. E\u011fer bu <code>Observable<\/code> bir hata yayarsa, orijinal ak\u0131\u015f da hata ile sonlan\u0131r. E\u011fer <code>complete<\/code> olursa, orijinal ak\u0131\u015f da tamamlan\u0131r.<\/p>\n<p><strong>\u0130mza:<\/strong><\/p>\n<pre><code class=\"language-typescript\">retryWhen(notifier: (errors: Observable<any>) => Observable<any>)<\/code><\/pre>\n<p><strong>Kullan\u0131m Durumlar\u0131:<\/strong><\/p>\n<p>1.  <strong>\u00dcstel Geri \u00c7ekilme (Exponential Backoff):<\/strong> Hata durumunda yeniden deneme aral\u0131\u011f\u0131n\u0131 her seferinde art\u0131rmak.<\/p>\n<pre><code class=\"language-typescript\">import { timer, throwError, of } from 'rxjs';\n    import { mergeMap, retryWhen, delay, take, tap } from 'rxjs\/operators';\n\n    let retryAttempt = 0;\n\n    function flakyService() {\n      return timer(500).pipe(\n        mergeMap(() => {\n          retryAttempt++;\n          if (retryAttempt < 4) {\n            console.log(<code>Flaky servis denemesi ${retryAttempt}: Hata olu\u015ftu.<\/code>);\n            return throwError(() => new Error('Servis ge\u00e7ici olarak kullan\u0131lam\u0131yor.'));\n          } else {\n            console.log(<code>Flaky servis denemesi ${retryAttempt}: Ba\u015far\u0131l\u0131!<\/code>);\n            return of('Flaky Servis Verisi');\n          }\n        })\n      );\n    }\n\n    flakyService().pipe(\n      retryWhen(errors =>\n        errors.pipe(\n          tap(err => console.error('Hata ak\u0131\u015f\u0131:', err.message)),\n          delay(1000), \/\/ \u0130lk gecikme\n          take(3) \/\/ Maksimum 3 yeniden deneme (toplam 4 deneme)\n        )\n      )\n    ).subscribe({\n      next: data => console.log('Al\u0131nan Veri (flaky):', data),\n      error: err => console.error('Abone hatas\u0131 (flaky):', err.message),\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131 (flaky).')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ Flaky servis denemesi 1: Hata olu\u015ftu.\n    \/\/ Hata ak\u0131\u015f\u0131: Servis ge\u00e7ici olarak kullan\u0131lam\u0131yor.\n    \/\/ (1 saniye bekleme)\n    \/\/ Flaky servis denemesi 2: Hata olu\u015ftu.\n    \/\/ Hata ak\u0131\u015f\u0131: Servis ge\u00e7ici olarak kullan\u0131lam\u0131yor.\n    \/\/ (1 saniye bekleme)\n    \/\/ Flaky servis denemesi 3: Hata olu\u015ftu.\n    \/\/ Hata ak\u0131\u015f\u0131: Servis ge\u00e7ici olarak kullan\u0131lam\u0131yor.\n    \/\/ (1 saniye bekleme)\n    \/\/ Flaky servis denemesi 4: Ba\u015far\u0131l\u0131!\n    \/\/ Al\u0131nan Veri (flaky): Flaky Servis Verisi\n    \/\/ Ak\u0131\u015f tamamland\u0131 (flaky).<\/code><\/pre>\n<p>    Bu \u00f6rnekte, her hata sonras\u0131 1 saniye gecikmeyle yeniden deneme yap\u0131l\u0131yor. <code>take(3)<\/code> ile 3 kez yeniden deneme s\u0131n\u0131r\u0131 konuluyor. Daha karma\u015f\u0131k senaryolarda, <code>delay<\/code> operat\u00f6r\u00fcne bir fonksiyon vererek gecikme s\u00fcresini dinamik olarak art\u0131rabilirsiniz (\u00fcstel geri \u00e7ekilme).<\/p>\n<h4><code>finalize<\/code><\/h4>\n<p><code>finalize<\/code> operat\u00f6r\u00fc, bir <code>Observable<\/code> ak\u0131\u015f\u0131 tamamland\u0131\u011f\u0131nda (ba\u015far\u0131yla veya hata ile) veya abonelik iptal edildi\u011finde \u00e7al\u0131\u015fan bir geri \u00e7a\u011f\u0131rma (callback) fonksiyonu tan\u0131mlaman\u0131z\u0131 sa\u011flar. Hata y\u00f6netimi i\u00e7in do\u011frudan bir mekanizma olmasa da, hata durumunda kaynaklar\u0131 serbest b\u0131rakmak veya UI durumunu g\u00fcncellemek gibi temizleme i\u015flemleri i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n<code>finalize<\/code> operat\u00f6r\u00fc, ak\u0131\u015f\u0131n herhangi bir \u015fekilde sona ermesi durumunda (next, error veya complete ile) veya aboneli\u011fin iptal edilmesi durumunda \u00e7a\u011fr\u0131lan tek bir fonksiyon al\u0131r.<\/p>\n<p><strong>\u0130mza:<\/strong><\/p>\n<pre><code class=\"language-typescript\">finalize(callback: () => void)<\/code><\/pre>\n<p><strong>Kullan\u0131m Durumlar\u0131:<\/strong><\/p>\n<p>1.  <strong>Y\u00fckleme G\u00f6stergelerini Gizleme:<\/strong> Bir a\u011f iste\u011fi ba\u015flad\u0131\u011f\u0131nda bir y\u00fckleme g\u00f6stergesi g\u00f6sterip, istek tamamland\u0131\u011f\u0131nda veya hata verdi\u011finde gizlemek.<\/p>\n<pre><code class=\"language-typescript\">import { of, throwError } from 'rxjs';\n    import { finalize, tap } from 'rxjs\/operators';\n\n    function simulateDataLoad(shouldFail: boolean) {\n      console.log('Y\u00fckleme ba\u015flad\u0131...');\n      return shouldFail ? throwError(() => new Error('Y\u00fckleme hatas\u0131')) : of('Y\u00fcklenen Veri').pipe(delay(1000));\n    }\n\n    simulateDataLoad(true).pipe(\n      finalize(() => console.log('Y\u00fckleme tamamland\u0131 (hata veya ba\u015far\u0131).')),\n      catchError(error => {\n        console.error('Hata yakaland\u0131:', error.message);\n        return of('Varsay\u0131lan Veri');\n      })\n    ).subscribe({\n      next: data => console.log('Veri:', data),\n      error: err => console.error('Abone hatas\u0131:', err.message),\n      complete: () => console.log('Ak\u0131\u015f tamamland\u0131.')\n    });\n\n    \/\/ \u00c7\u0131kt\u0131 (hata durumunda):\n    \/\/ Y\u00fckleme ba\u015flad\u0131...\n    \/\/ Y\u00fckleme tamamland\u0131 (hata veya ba\u015far\u0131).\n    \/\/ Hata yakaland\u0131: Y\u00fckleme hatas\u0131\n    \/\/ Veri: Varsay\u0131lan Veri\n    \/\/ Ak\u0131\u015f tamamland\u0131.\n\n    \/\/ \u00c7\u0131kt\u0131 (ba\u015far\u0131l\u0131 durumda):\n    \/\/ Y\u00fckleme ba\u015flad\u0131...\n    \/\/ (1 saniye bekleme)\n    \/\/ Y\u00fckleme tamamland\u0131 (hata veya ba\u015far\u0131).\n    \/\/ Veri: Y\u00fcklenen Veri\n    \/\/ Ak\u0131\u015f tamamland\u0131.<\/code><\/pre>\n<h4><code>onErrorResumeNext<\/code> (K\u0131sa Bahis)<\/h4>\n<p><code>onErrorResumeNext<\/code> operat\u00f6r\u00fc, bir <code>Observable<\/code> hata verdi\u011finde, bir sonraki <code>Observable<\/code>&#8216;a abone olarak ak\u0131\u015f\u0131 devam ettirmenizi sa\u011flar. Bu, birden fazla yedek veri kayna\u011f\u0131 denemek gibi durumlarda kullan\u0131labilir. Ancak, genellikle <code>catchError<\/code> ile daha esnek \u00e7\u00f6z\u00fcmler \u00fcretilebilir ve <code>onErrorResumeNext<\/code> daha az yayg\u0131n kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { of, throwError, onErrorResumeNext } from 'rxjs';\nimport { delay } from 'rxjs\/operators';\n\nconst source1 = throwError(() => new Error('Kaynak 1 Hatas\u0131'));\nconst source2 = of('Kaynak 2 Verisi').pipe(delay(500));\nconst source3 = of('Kaynak 3 Verisi');\n\nonErrorResumeNext(source1, source2, source3).subscribe({\n  next: val => console.log('Al\u0131nan:', val),\n  error: err => console.error('Hata:', err),\n  complete: () => console.log('Tamamland\u0131.')\n});\n\n\/\/ \u00c7\u0131kt\u0131:\n\/\/ Al\u0131nan: Kaynak 2 Verisi\n\/\/ Al\u0131nan: Kaynak 3 Verisi\n\/\/ Tamamland\u0131.<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>source1<\/code> hata verdi\u011finde, <code>onErrorResumeNext<\/code> otomatik olarak <code>source2<\/code>&#8216;ye ge\u00e7er. <code>source2<\/code> ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda ise <code>source3<\/code>&#8216;e ge\u00e7er.<\/p>\n<h3>Global Hata Y\u00f6netimi<\/h3>\n<p>Baz\u0131 durumlarda, bir <code>Observable<\/code>&#8216;daki hata <code>catchError<\/code> gibi operat\u00f6rler taraf\u0131ndan yakalanmaz ve ak\u0131\u015f\u0131n en \u00fcst seviyesine kadar y\u00fckselir. Bu t\u00fcr yakalanmayan hatalar\u0131 izlemek veya \u00f6zel olarak ele almak i\u00e7in RxJS&#8217;in global hata i\u015fleyicisini kullanabiliriz.<\/p>\n<p>RxJS, <code>config.onUnhandledError<\/code> \u00f6zelli\u011fini sunar (RxJS 6&#8217;dan itibaren <code>rxjs\/internal\/config<\/code> veya do\u011frudan <code>rxjs<\/code>&#8216;den eri\u015filebilir). Bu, yakalanmayan hatalar i\u00e7in genel bir geri \u00e7a\u011f\u0131rma fonksiyonu tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { throwError, of } from 'rxjs';\nimport { delay } from 'rxjs\/operators';\nimport { config } from 'rxjs'; \/\/ RxJS 6+ i\u00e7in\n\n\/\/ Global hata i\u015fleyiciyi tan\u0131mlama\nconfig.onUnhandledError = (err) => {\n  console.error('Global yakalanmayan hata:', err);\n  \/\/ Burada hata raporlama servisine g\u00f6nderme, UI'da bildirim g\u00f6sterme vb. yap\u0131labilir.\n};\n\n\/\/ Hata yakalanmayan bir Observable\nthrowError(() => new Error('Yakalanmayan bir hata!')).pipe(\n  delay(100) \/\/ Asenkron hale getir\n).subscribe({\n  next: val => console.log('Veri:', val),\n  complete: () => console.log('Tamamland\u0131.')\n});\n\n\/\/ \u00c7\u0131kt\u0131 (yakla\u015f\u0131k 100ms sonra):\n\/\/ Global yakalanmayan hata: Error: Yakalanmayan bir hata!<\/code><\/pre>\n<p>Bu mekanizma, uygulaman\u0131zdaki herhangi bir <code>Observable<\/code> ak\u0131\u015f\u0131nda g\u00f6zden ka\u00e7an hatalar\u0131 tespit etmek ve merkezi bir yerde ele almak i\u00e7in \u00e7ok de\u011ferlidir. Ancak, bu i\u015fleyici hatay\u0131 yakalar ama ak\u0131\u015f\u0131n durmas\u0131n\u0131 engellemez; sadece hatan\u0131n bildirimini sa\u011flar.<\/p>\n<h3>Hata Y\u00f6netimi \u0130\u00e7in En \u0130yi Uygulamalar<\/h3>\n<p>RxJS&#8217;te etkili hata y\u00f6netimi, sadece operat\u00f6rleri bilmekle kalmaz, ayn\u0131 zamanda belirli prensiplere uymay\u0131 da gerektirir:<\/p>\n<p>1.  <strong>Hatalar\u0131 Erken Yakalay\u0131n:<\/strong> M\u00fcmk\u00fcnse, hatan\u0131n kayna\u011f\u0131na en yak\u0131n yerde <code>catchError<\/code> kullan\u0131n. Bu, hatan\u0131n daha geni\u015f ak\u0131\u015flar\u0131 etkilemesini engeller ve hatan\u0131n ba\u011flam\u0131n\u0131 korur. \u00d6rne\u011fin, bir API \u00e7a\u011fr\u0131s\u0131n\u0131n hemen sonras\u0131nda.<\/p>\n<p>2.  <strong>Spesifik Olun:<\/strong> Yaln\u0131zca bekledi\u011finiz ve y\u00f6netebilece\u011finiz hatalar\u0131 yakalay\u0131n. Genel bir <code>catchError<\/code> kullanmak yerine, belirli hata t\u00fcrleri i\u00e7in \u00f6zel i\u015fleyiciler yazmay\u0131 d\u00fc\u015f\u00fcn\u00fcn.<\/p>\n<p>3.  <strong>Hatalar\u0131 Kaydedin (Loglama):<\/strong> Her zaman yakalanan veya yakalanmayan hatalar\u0131 kaydetti\u011finizden emin olun. Bu, sorun giderme ve uygulaman\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in kritik \u00f6neme sahiptir. <code>tap<\/code> operat\u00f6r\u00fc, yan etkiler (logging gibi) i\u00e7in kullan\u0131labilir.<\/p>\n<p>4.  <strong>Kullan\u0131c\u0131ya Geri Bildirim Sa\u011flay\u0131n:<\/strong> Kullan\u0131c\u0131 aray\u00fcz\u00fcnde hatalar hakk\u0131nda anlaml\u0131 geri bildirimler sa\u011flay\u0131n. &#8220;Bir hata olu\u015ftu&#8221; yerine &#8220;Veriler y\u00fcklenemedi, l\u00fctfen daha sonra tekrar deneyin&#8221; gibi mesajlar daha faydal\u0131d\u0131r.<\/p>\n<p>5.  <strong>Hatalar\u0131 &#8220;Yutmaktan&#8221; Ka\u00e7\u0131n\u0131n:<\/strong> Sadece <code>catchError(() => EMPTY)<\/code> veya <code>catchError(() => of(null))<\/code> kullanarak hatay\u0131 sessizce yok saymay\u0131n. E\u011fer hatay\u0131 i\u015flemeyecekseniz bile, en az\u0131ndan loglay\u0131n veya kullan\u0131c\u0131ya bildirin. Aksi takdirde, uygulaman\u0131zda tespit edilmesi zor hatalar gizlenebilir.<\/p>\n<p>6.  <strong>Yeniden Denemelerde \u0130dempotensi Dikkate Al\u0131n:<\/strong> <code>retry<\/code> veya <code>retryWhen<\/code> kullan\u0131rken, yeniden denedi\u011finiz i\u015flemin birden fazla kez g\u00fcvenli bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131labilece\u011finden emin olun (idempotent). \u00d6rne\u011fin, bir \u00f6deme i\u015flemini yeniden denemek, \u00e7ifte \u00f6demeye yol a\u00e7abilir.<\/p>\n<p>7.  <strong>Ak\u0131\u015f Sonland\u0131rmay\u0131 Anlay\u0131n:<\/strong> <code>catchError<\/code> kullanmad\u0131\u011f\u0131n\u0131z s\u00fcrece, bir hata ak\u0131\u015f\u0131 sonland\u0131r\u0131r. Bu, aboneli\u011fin sona erdi\u011fi ve daha fazla de\u011ferin yay\u0131lmayaca\u011f\u0131 anlam\u0131na gelir. Bu davran\u0131\u015f\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak ak\u0131\u015flar\u0131n\u0131z\u0131 tasarlay\u0131n.<\/p>\n<p>8.  <strong>\u0130\u00e7 \u0130\u00e7e Observables&#8217;daki Hatalar:<\/strong> <code>switchMap<\/code>, <code>mergeMap<\/code>, <code>concatMap<\/code> gibi operat\u00f6rler i\u00e7inde d\u00f6nen i\u00e7 <code>Observable<\/code>&#8216;lar\u0131n hatalar\u0131n\u0131 da yakalamay\u0131 unutmay\u0131n. Aksi takdirde, i\u00e7 <code>Observable<\/code>&#8216;daki bir hata, d\u0131\u015f <code>Observable<\/code>&#8216;\u0131 da sonland\u0131rabilir.<\/p>\n<pre><code class=\"language-typescript\">import { of, throwError } from 'rxjs';\n    import { switchMap, catchError } from 'rxjs\/operators';\n\n    of(1).pipe(\n      switchMap(() =>\n        throwError(() => new Error('\u0130\u00e7 Observable hatas\u0131!')) \/\/ \u0130\u00e7 Observable'da hata\n      ),\n      catchError(error => {\n        console.error('D\u0131\u015f Observable taraf\u0131ndan yakalanan hata:', error.message);\n        return of('Yedek de\u011fer');\n      })\n    ).subscribe({\n      next: val => console.log('De\u011fer:', val),\n      error: err => console.error('Abone hatas\u0131:', err.message)\n    });\n\n    \/\/ \u00c7\u0131kt\u0131:\n    \/\/ D\u0131\u015f Observable taraf\u0131ndan yakalanan hata: \u0130\u00e7 Observable hatas\u0131!\n    \/\/ De\u011fer: Yedek de\u011fer<\/code><\/pre>\n<p>    Bu \u00f6rnekte, <code>switchMap<\/code> i\u00e7indeki hata, d\u0131\u015f ak\u0131\u015f\u0131 da sonland\u0131raca\u011f\u0131 i\u00e7in <code>catchError<\/code> d\u0131\u015f <code>Observable<\/code>&#8216;a uygulanarak hata yakalanm\u0131\u015ft\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>RxJS, asenkron programlamay\u0131 basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r, ancak reaktif ak\u0131\u015flarda hata y\u00f6netimi, uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131 ve g\u00fcvenilirli\u011fi i\u00e7in kritik bir bile\u015fendir. <code>catchError<\/code>, <code>retry<\/code>, <code>retryWhen<\/code> ve <code>finalize<\/code> gibi operat\u00f6rler, hatalar\u0131 yakalama, kurtarma, yeniden deneme ve temizleme i\u015flemleri i\u00e7in size esnek ve g\u00fc\u00e7l\u00fc mekanizmalar sunar.<\/p>\n<p>Bu operat\u00f6rleri do\u011fru bir \u015fekilde kullanarak ve yukar\u0131da belirtilen en iyi uygulamalar\u0131 takip ederek, RxJS ak\u0131\u015flar\u0131n\u0131z\u0131 hatalara kar\u015f\u0131 daha diren\u00e7li hale getirebilirsiniz. Unutmay\u0131n ki sa\u011flam bir hata y\u00f6netimi stratejisi, sadece kodunuzu daha g\u00fcvenilir k\u0131lmakla kalmaz, ayn\u0131 zamanda geli\u015ftirme s\u00fcrecinde hatalar\u0131 daha kolay tespit etmenize ve gidermenize de yard\u0131mc\u0131 olur. RxJS&#8217;in sundu\u011fu bu ara\u00e7lar\u0131 ustaca kullanarak, daha robust ve kullan\u0131c\u0131 dostu reaktif uygulamalar in\u015fa edebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak\nRxJS, reaktif programlaman\u0131n g\u00fcc\u00fcn\u00fc JavaScript d\u00fcnyas\u0131na ta\u015f\u0131yan, asenkron ve","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-31417","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&#039;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak - 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\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RxJS&#039;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak\" \/>\n<meta property=\"og:description\" content=\"RxJS&#039;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak RxJS, reaktif programlaman\u0131n g\u00fcc\u00fcn\u00fc JavaScript d\u00fcnyas\u0131na ta\u015f\u0131yan, asenkron ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-09T16:41:09+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=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak\",\"datePublished\":\"2025-10-09T16:41:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\"},\"wordCount\":1774,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\",\"name\":\"RxJS'te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-09T16:41:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak\"}]},{\"@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'te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak - 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\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/","og_locale":"tr_TR","og_type":"article","og_title":"RxJS'te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak","og_description":"RxJS'te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak RxJS, reaktif programlaman\u0131n g\u00fcc\u00fcn\u00fc JavaScript d\u00fcnyas\u0131na ta\u015f\u0131yan, asenkron ve","og_url":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-09T16:41:09+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak","datePublished":"2025-10-09T16:41:09+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/"},"wordCount":1774,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/","url":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/","name":"RxJS'te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-09T16:41:09+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/rxjste-basit-hata-yonetimi-akislarinizi-guvende-tutmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"RxJS&#8217;te Basit Hata Y\u00f6netimi: Ak\u0131\u015flar\u0131n\u0131z\u0131 G\u00fcvende Tutmak"}]},{"@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\/31417","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=31417"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31417\/revisions"}],"predecessor-version":[{"id":31418,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31417\/revisions\/31418"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}