{"id":35816,"date":"2025-12-04T05:32:40","date_gmt":"2025-12-04T02:32:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/"},"modified":"2025-12-04T05:32:40","modified_gmt":"2025-12-04T02:32:40","slug":"solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/","title":{"rendered":"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn interaktif web uygulamalar\u0131nda, kullan\u0131c\u0131lar s\u00fcrekli de\u011fi\u015fen bir deneyim beklerler. Bir arama kutusuna yaz\u0131 yazmaya ba\u015flad\u0131\u011f\u0131n\u0131zda an\u0131nda sonu\u00e7lar g\u00f6rmek, bir dosyay\u0131 y\u00fcklerken ilerleme \u00e7ubu\u011funu izlemek veya bir sayfadan ayr\u0131l\u0131rken arka plandaki gereksiz veri \u00e7ekme i\u015flemlerinin durduruldu\u011funu bilmek, modern web deneyiminin temel ta\u015flar\u0131d\u0131r. Peki, arka planda \u00e7al\u0131\u015fan ve art\u0131k ihtiyac\u0131m\u0131z olmayan bir veri iste\u011fi ne olacak? Ya da kullan\u0131c\u0131n\u0131n sayfay\u0131 terk etmesiyle anlams\u0131z hale gelen uzun s\u00fcreli bir i\u015flem? \u0130\u015fte tam bu noktada &#8220;iptal edilebilir asenkron i\u015flemler&#8221; kavram\u0131 devreye giriyor.<\/p>\n<p>\u0130ptal edilebilirlik, sadece performans a\u00e7\u0131s\u0131ndan de\u011fil, ayn\u0131 zamanda uygulama kaynaklar\u0131n\u0131n verimli kullan\u0131m\u0131 ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan da hayati bir \u00f6neme sahiptir. D\u00fc\u015f\u00fcnsenize, bir kullan\u0131c\u0131 arama kutusuna &#8220;SolidJS&#8221; yazd\u0131, sonra fikrini de\u011fi\u015ftirip &#8220;LazyPromise&#8221; yazd\u0131. \u0130lk &#8220;SolidJS&#8221; aramas\u0131 i\u00e7in yap\u0131lan API iste\u011fi hala sunucuya ula\u015f\u0131yor ve belki de b\u00fcy\u00fck bir veri setini geri d\u00f6nd\u00fcr\u00fcyor. Bu gereksiz i\u015flem, hem sunucu kaynaklar\u0131n\u0131 t\u00fcketir hem de istemcinin a\u011f bant geni\u015fli\u011fini me\u015fgul eder. En \u00f6nemlisi, sonu\u00e7lar geri d\u00f6nd\u00fc\u011f\u00fcnde, kullan\u0131c\u0131 zaten &#8220;LazyPromise&#8221; sonu\u00e7lar\u0131n\u0131 bekledi\u011fi i\u00e7in bu veriler tamamen g\u00f6z ard\u0131 edilir. Bu durum, \u00f6zellikle mobil cihazlarda veya yava\u015f internet ba\u011flant\u0131lar\u0131nda daha belirgin bir sorun haline gelir.<\/p>\n<p>Ayr\u0131ca, bir kullan\u0131c\u0131 bir sayfadan di\u011ferine h\u0131zla ge\u00e7i\u015f yapt\u0131\u011f\u0131nda, \u00f6nceki sayfada ba\u015flat\u0131lan ancak hen\u00fcz tamamlanmam\u0131\u015f asenkron i\u015flemlerin durdurulmas\u0131 gerekir. Aksi takdirde, bu i\u015flemler tamamland\u0131\u011f\u0131nda bile uygulama belle\u011finde veya UI&#8217;da beklenmedik durumlar (memory leaks, race conditions, stale data) yaratabilirler. Bu t\u00fcr durumlar, uygulaman\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 bozar ve hata ay\u0131klamay\u0131 zorla\u015ft\u0131r\u0131r. \u0130\u015fte bu y\u00fczden, asenkron g\u00f6revleri programatik olarak durdurabilme yetene\u011fi, sa\u011flam ve duyarl\u0131 bir kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) geli\u015ftirmek i\u00e7in vazge\u00e7ilmezdir. Bu makalede, SolidJS&#8217;in reaktif yap\u0131s\u0131n\u0131 LazyPromise&#8217;in g\u00fc\u00e7l\u00fc iptal mekanizmalar\u0131yla birle\u015ftirerek bu sorunlar\u0131 nas\u0131l a\u015fabilece\u011fimizi detayl\u0131ca inceleyece\u011fiz. Ayr\u0131ca, asenkron i\u015flemlerin di\u011fer \u00f6nemli bir y\u00f6n\u00fc olan sunucu hatalar\u0131n\u0131 tipli bir \u015fekilde ele alman\u0131n uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini nas\u0131l art\u0131raca\u011f\u0131n\u0131 da ele alaca\u011f\u0131z. Bu yakla\u015f\u0131mlar, modern web geli\u015ftirmenin en iyi pratikleri aras\u0131nda yer almaktad\u0131r.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: \u0130ptal edilebilir g\u00f6revler, \u00f6zellikle h\u0131zl\u0131 arama, otomatik tamamlama ve dosya y\u00fckleme gibi kullan\u0131c\u0131 etkile\u015fimlerinin yo\u011fun oldu\u011fu senaryolarda uygulaman\u0131z\u0131n duyarl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu sayede gereksiz a\u011f isteklerini keserek hem istemci hem de sunucu kaynaklar\u0131ndan tasarruf edebilirsiniz.\n    <\/div>\n<h2>SolidJS, Asenkron Programlama ve Hata Y\u00f6netimi Temelleri Nelerdir?<\/h2>\n<p>Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) bloklamadan veri \u00e7ekme, dosya i\u015fleme ve karma\u015f\u0131k hesaplamalar gibi i\u015flemleri ger\u00e7ekle\u015ftirmektir. Bu, asenkron programlaman\u0131n temelini olu\u015fturur. SolidJS, bu ba\u011flamda, reaktif ve y\u00fcksek performansl\u0131 bir UI k\u00fct\u00fcphanesi olarak \u00f6ne \u00e7\u0131kar. Ancak SolidJS&#8217;in kendisi, asenkron i\u015flemleri y\u00f6netmek i\u00e7in do\u011frudan bir mekanizma sunmaz; bunun yerine JavaScript&#8217;in yerle\u015fik Promise API&#8217;si ve Async\/Await s\u00f6zdizimi ile uyumlu bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Verimli bir SolidJS uygulamas\u0131 i\u00e7in bu temelleri iyi anlamak kritik \u00f6neme sahiptir.<\/p>\n<p>Asenkron programlamada, bir i\u015flem genellikle hemen bir sonu\u00e7 d\u00f6nd\u00fcrmez, bunun yerine gelecekte bir zamanda tamamlanaca\u011f\u0131n\u0131 garanti eden bir &#8220;promise&#8221; d\u00f6nd\u00fcr\u00fcr. Bu promise, i\u015flemin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 (<code>resolve<\/code>) veya bir hata ile kar\u015f\u0131la\u015f\u0131p kar\u015f\u0131la\u015fmad\u0131\u011f\u0131n\u0131 (<code>reject<\/code>) temsil eder. JavaScript&#8217;in <code>async\/await<\/code> s\u00f6zdizimi, bu promise&#8217;lerle \u00e7al\u0131\u015fmay\u0131 senkron koda benzer hale getirerek okunabilirli\u011fi art\u0131r\u0131r. Ancak, standart <code>Promise<\/code> API&#8217;sinde do\u011frudan bir iptal mekanizmas\u0131 bulunmaz. Bir promise bir kez ba\u015flat\u0131ld\u0131\u011f\u0131nda, ya tamamlan\u0131r ya da bir hata ile sonu\u00e7lan\u0131r; ancak d\u0131\u015far\u0131dan durdurulamaz. Bu eksiklik, yukar\u0131da bahsetti\u011fimiz gibi gereksiz i\u015flemlerin birikmesine neden olabilir.<\/p>\n<p>Hata y\u00f6netimi ise asenkron programlaman\u0131n ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. A\u011f istekleri, sunucu hatalar\u0131, yetkilendirme sorunlar\u0131 veya beklenmedik veri formatlar\u0131 gibi bir\u00e7ok nedenle ba\u015far\u0131s\u0131z olabilir. Bu hatalar\u0131 do\u011fru bir \u015fekilde yakalamak ve kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunmak, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 memnuniyeti i\u00e7in esast\u0131r. Geleneksel olarak, JavaScript&#8217;te hatalar <code>try...catch<\/code> bloklar\u0131 veya promise&#8217;lerin <code>.catch()<\/code> metodu ile y\u00f6netilir. Ancak bu yakla\u015f\u0131mlar genellikle genel hata mesajlar\u0131 sunar. \u00d6zellikle karma\u015f\u0131k kurumsal uygulamalarda, sunucudan d\u00f6nen hata tiplerini \u00f6nceden bilmek ve bunlara \u00f6zel tepkiler vermek (\u00f6rne\u011fin, &#8220;Kullan\u0131c\u0131 Ad\u0131 Zaten Kullan\u0131l\u0131yor&#8221; yerine genel bir &#8220;Hata Olu\u015ftu&#8221; mesaj\u0131 vermek) \u00e7ok daha verimli ve kullan\u0131c\u0131 dostudur. TypeScript, bu noktada devreye girerek, sunucu hata yan\u0131tlar\u0131n\u0131 tipli bir \u015fekilde modellememize ve b\u00f6ylece hatalar\u0131 daha g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde ele almam\u0131za olanak tan\u0131r.<\/p>\n<p>Bu b\u00f6l\u00fcm\u00fcn geri kalan\u0131nda, tam da bu eksiklikleri gidermek i\u00e7in tasarlanm\u0131\u015f bir k\u00fct\u00fcphane olan LazyPromise&#8217;in ne oldu\u011funu ve tipli sunucu hatalar\u0131n\u0131n neden gerekli oldu\u011funu derinlemesine inceleyece\u011fiz. Bu kavramlar, SolidJS&#8217;in reaktif do\u011fas\u0131yla birle\u015fti\u011finde, hem performansl\u0131 hem de bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>LazyPromise Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>LazyPromise, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi &#8220;tembel&#8221; bir promise uygulamas\u0131d\u0131r. Standart JavaScript Promise&#8217;lerinin aksine, bir LazyPromise \u00f6rne\u011fi olu\u015fturuldu\u011funda i\u00e7erisindeki asenkron i\u015flem hemen ba\u015flamaz. Bunun yerine, i\u015flem yaln\u0131zca <code>.then()<\/code> veya <code>.catch()<\/code> metotlar\u0131 \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda tetiklenir. Bu &#8220;tembel ba\u015flatma&#8221; \u00f6zelli\u011fi, asenkron g\u00f6revleri gerekti\u011finde ba\u015flatma esnekli\u011fi sa\u011flar ve gereksiz kaynak t\u00fcketimini \u00f6nler. Ancak LazyPromise&#8217;in as\u0131l g\u00fcc\u00fc, iptal edilebilir olmas\u0131d\u0131r.<\/p>\n<p>LazyPromise, <code>AbortController<\/code> ve <code>AbortSignal<\/code> API&#8217;lerini kullanarak promise&#8217;lerin iptal edilebilirli\u011fini sa\u011flar. Bir <code>AbortController<\/code> olu\u015fturdu\u011funuzda, bu size bir <code>signal<\/code> nesnesi ve bir <code>abort()<\/code> metodu sunar. <code>signal<\/code> nesnesini, fetch istekleri gibi asenkron i\u015flemlere bir se\u00e7enek olarak ge\u00e7irebilirsiniz. E\u011fer <code>controller.abort()<\/code> \u00e7a\u011fr\u0131l\u0131rsa, <code>signal<\/code> nesnesi &#8220;aborted&#8221; durumuna ge\u00e7er ve bu sinyali dinleyen t\u00fcm i\u015flemler otomatik olarak iptal edilir. \u00d6rne\u011fin, bir <code>fetch<\/code> iste\u011fine <code>signal<\/code> parametresini verdi\u011finizde, istek sunucudan yan\u0131t gelmeden iptal edilebilir ve bir <code>AbortError<\/code> f\u0131rlat\u0131r.<\/p>\n<p>LazyPromise, bu mekanizmay\u0131 kendi b\u00fcnyesinde bar\u0131nd\u0131r\u0131r. Bir LazyPromise olu\u015ftururken, i\u015flevinize bir <code>signal<\/code> nesnesi ve bir <code>controller<\/code> nesnesi ge\u00e7irilir. Bu sayede, promise i\u00e7inde uzun s\u00fcreli bir i\u015flem ba\u015flatabilir ve bu i\u015flemin durumunu izleyebilirsiniz. E\u011fer d\u0131\u015far\u0131dan promise&#8217;in <code>.cancel()<\/code> metodu \u00e7a\u011fr\u0131l\u0131rsa, LazyPromise otomatik olarak i\u00e7erisindeki <code>AbortController<\/code>&#8216;\u0131 kullanarak ili\u015fkili t\u00fcm i\u015flemleri iptal eder. Bu, \u00f6zellikle kullan\u0131c\u0131 aray\u00fcz\u00fc etkile\u015fimleriyle tetiklenen API \u00e7a\u011fr\u0131lar\u0131nda veya uzun s\u00fcreli hesaplamalarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Kullan\u0131c\u0131 bir i\u015flem devam ederken ba\u015fka bir eylem ba\u015flatt\u0131\u011f\u0131nda, \u00f6nceki i\u015flemin kolayca durdurulmas\u0131n\u0131 sa\u011flar ve b\u00f6ylece yar\u0131\u015f ko\u015fullar\u0131n\u0131n (race conditions) ve gereksiz kaynak kullan\u0131m\u0131n\u0131n \u00f6n\u00fcne ge\u00e7er.<\/p>\n<p>\u00d6zetle, LazyPromise&#8217;in temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Tembel Ba\u015flatma:<\/b> \u0130\u015flem, <code>.then()<\/code> veya <code>.catch()<\/code> \u00e7a\u011fr\u0131lana kadar ba\u015flamaz.<\/li>\n<li><b>\u0130ptal Edilebilirlik:<\/b> <code>.cancel()<\/code> metodu ile devam eden asenkron i\u015flemler durdurulabilir.<\/li>\n<li><b>AbortController Entegrasyonu:<\/b> Modern taray\u0131c\u0131 API&#8217;leri ile uyumlu bir iptal mekanizmas\u0131 sunar.<\/li>\n<li><b>SolidJS ile Uyumlu:<\/b> Reaktif SolidJS uygulamalar\u0131nda, \u00f6zellikle <code>createResource<\/code> veya <code>createEffect<\/code> ile kullan\u0131ld\u0131\u011f\u0131nda g\u00fc\u00e7l\u00fc bir sinerji olu\u015fturur.<\/li>\n<\/ul>\n<h3>Tipli Sunucu Hatalar\u0131 Neden Gerekli?<\/h3>\n<p>Web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini ve geli\u015ftirici verimlili\u011fini art\u0131ran en \u00f6nemli fakt\u00f6rlerden biri, hata y\u00f6netiminin sa\u011flam ve \u00f6ng\u00f6r\u00fclebilir olmas\u0131d\u0131r. Sunucu taraf\u0131nda meydana gelen hatalar, a\u011f kesintileri, do\u011frulama sorunlar\u0131, yetkilendirme yetersizlikleri veya sunucu taraf\u0131ndaki i\u00e7 hatalar gibi \u00e7e\u015fitli nedenlerle ortaya \u00e7\u0131kabilir. Bu hatalar\u0131 yakalamak ve kullan\u0131c\u0131ya do\u011fru bilgiyi sunmak, uygulaman\u0131z\u0131n kalitesini do\u011frudan etkiler. \u0130\u015fte tam bu noktada, &#8220;tipli sunucu hatalar\u0131&#8221; kavram\u0131 devreye girer.<\/p>\n<p>Geleneksel olarak, sunucu hatalar\u0131 genellikle genel HTTP durum kodlar\u0131 (\u00f6rne\u011fin, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error) ve bazen basit bir JSON objesi i\u00e7inde bir mesajla (<code>{ \"message\": \"Bir hata olu\u015ftu\" }<\/code>) temsil edilir. Ancak bu yakla\u015f\u0131m, istemci taraf\u0131nda hatan\u0131n ger\u00e7ek nedenini programatik olarak anlamay\u0131 ve buna \u00f6zel bir UI veya i\u015f mant\u0131\u011f\u0131 uygulamay\u0131 zorla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, bir formda &#8220;Bu e-posta adresi zaten kullan\u0131mda&#8221; hatas\u0131 ile &#8220;\u015eifre \u00e7ok k\u0131sa&#8221; hatas\u0131 aras\u0131nda ayr\u0131m yapmak isterseniz, sadece genel bir hata mesaj\u0131 yeterli olmayacakt\u0131r.<\/p>\n<p>Tipli sunucu hatalar\u0131, TypeScript&#8217;in g\u00fcc\u00fcn\u00fc kullanarak sunucudan d\u00f6nen hata yan\u0131tlar\u0131n\u0131 belirli aray\u00fczler (interface) veya tipler (type) arac\u0131l\u0131\u011f\u0131yla modellememizi sa\u011flar. Bu, istemci taraf\u0131nda gelen hata nesnesinin yap\u0131s\u0131n\u0131 \u00f6nceden bilmemize olanak tan\u0131r. B\u00f6ylece, gelen hata yan\u0131t\u0131n\u0131 g\u00fcvenli bir \u015fekilde kontrol edebilir, farkl\u0131 hata tiplerine g\u00f6re farkl\u0131 UI elementleri g\u00f6sterebilir veya farkl\u0131 i\u015f ak\u0131\u015flar\u0131n\u0131 tetikleyebiliriz. \u00d6rne\u011fin, bir <code>ValidationError<\/code> tipinde bir hata gelirse, bu hatan\u0131n i\u00e7erdi\u011fi spesifik alan hatalar\u0131n\u0131 formdaki ilgili input alanlar\u0131n\u0131n alt\u0131na yerle\u015ftirebiliriz. E\u011fer bir <code>UnauthorizedError<\/code> gelirse, kullan\u0131c\u0131y\u0131 oturum a\u00e7ma sayfas\u0131na y\u00f6nlendirebiliriz.<\/p>\n<p>Tipli sunucu hatalar\u0131 kullanman\u0131n avantajlar\u0131:<\/p>\n<ul>\n<li><b>Geli\u015ftirici Deneyimi:<\/b> Hatalar\u0131n yap\u0131s\u0131n\u0131 net bir \u015fekilde bilmek, hata ay\u0131klama ve y\u00f6netimini kolayla\u015ft\u0131r\u0131r. Otomatik tamamlama (autocomplete) ve tip g\u00fcvenli\u011fi sayesinde hatalar\u0131 daha h\u0131zl\u0131 ve hatas\u0131z bir \u015fekilde i\u015fleyebilirsiniz.<\/li>\n<li><b>Kullan\u0131c\u0131 Deneyimi:<\/b> Kullan\u0131c\u0131lara daha spesifik, anla\u015f\u0131l\u0131r ve eyleme ge\u00e7irilebilir hata mesajlar\u0131 sunulmas\u0131n\u0131 sa\u011flar. Bu da hayal k\u0131r\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r ve uygulaman\u0131n kullan\u0131labilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><b>Kod G\u00fcvenli\u011fi:<\/b> TypeScript&#8217;in tip kontrol\u00fc sayesinde, hatalar\u0131 yanl\u0131\u015f yorumlama veya eksik i\u015fleme olas\u0131l\u0131\u011f\u0131 azal\u0131r. \u00c7al\u0131\u015fma zaman\u0131 hatalar\u0131 yerine derleme zaman\u0131 hatalar\u0131 yakalan\u0131r.<\/li>\n<li><b>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/b> Hata i\u015fleme mant\u0131\u011f\u0131 daha mod\u00fcler ve okunabilir hale gelir, bu da uygulaman\u0131n uzun vadeli bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Sonu\u00e7 olarak, tipli sunucu hatalar\u0131, modern ve g\u00fcvenilir web uygulamalar\u0131 geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. SolidJS ve TypeScript ile bu yakla\u015f\u0131m\u0131 benimseyerek, uygulaman\u0131z\u0131n hata durumlar\u0131nda bile profesyonel ve duyarl\u0131 kalmas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\n<h2>SolidJS ve LazyPromise ile \u0130ptal Edilebilir \u0130stekler Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>SolidJS&#8217;in reaktif yap\u0131s\u0131 ve LazyPromise&#8217;in iptal edilebilir Promise mekanizmas\u0131n\u0131 bir araya getirerek, karma\u015f\u0131k asenkron i\u015flemleri etkili bir \u015fekilde y\u00f6netebiliriz. Bu b\u00f6l\u00fcm, SolidJS bile\u015fenlerinizde LazyPromise&#8217;i nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6stermeye odaklanacakt\u0131r. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan durumlar \u00fczerinden \u00f6rnekler sunarak, bu kombinasyonun g\u00fcc\u00fcn\u00fc g\u00f6zler \u00f6n\u00fcne serece\u011fiz. Ba\u015flang\u0131\u00e7 olarak, LazyPromise&#8217;i projenize dahil etmeniz gerekecektir. Bunun i\u00e7in basit bir npm veya yarn komutu yeterlidir:<\/p>\n<pre><code>\nnpm install lazy-promise\n# veya\nyarn add lazy-promise\n    <\/pre>\n<p><\/code><\/p>\n<p>Kurulum tamamland\u0131ktan sonra, LazyPromise'i SolidJS ortam\u0131nda kullanmaya ba\u015flayabiliriz. En yayg\u0131n senaryolardan biri, bir kullan\u0131c\u0131 aray\u00fcz\u00fc etkile\u015fimi (\u00f6rne\u011fin bir d\u00fc\u011fmeye t\u0131klama veya bir input alan\u0131na yazma) sonucunda bir API iste\u011fi ba\u015flatmakt\u0131r. E\u011fer kullan\u0131c\u0131 ayn\u0131 eylemi \u00e7ok h\u0131zl\u0131 bir \u015fekilde tekrarlarsa veya i\u015flemi ba\u015flatt\u0131ktan sonra vazge\u00e7erse, \u00f6nceki isteklerin iptal edilmesi gereklili\u011fi do\u011far. \u0130\u015fte bu noktada LazyPromise'in iptal yetene\u011fi devreye girer.<\/p>\n<p>SolidJS'te asenkron veri \u00e7ekme i\u015flemlerini y\u00f6netmek i\u00e7in genellikle <code>createResource<\/code> veya <code>createEffect<\/code> kancalar\u0131n\u0131 kullan\u0131r\u0131z. <code>createResource<\/code>, \u00f6zellikle verilerin UI'da g\u00f6sterilece\u011fi ve y\u00fckleme\/hata durumlar\u0131n\u0131n kolayca y\u00f6netilece\u011fi durumlar i\u00e7in tasarlanm\u0131\u015ft\u0131r. LazyPromise ile <code>createResource<\/code>'\u0131 kullanarak, veri \u00e7ekme i\u015flemlerini iptal edilebilir hale getirebiliriz. B\u00f6ylece, bir kayna\u011f\u0131n de\u011feri de\u011fi\u015fti\u011finde veya bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda \u00f6nceki isteklerin iptal edilmesini sa\u011flayabiliriz.<\/p>\n<p>Bu yakla\u015f\u0131m, \u00f6zellikle h\u0131zl\u0131 ve duyarl\u0131 bir kullan\u0131c\u0131 deneyimi sunmak istedi\u011finizde \u00e7ok de\u011ferlidir. \u00d6rne\u011fin, bir kullan\u0131c\u0131 bir arama terimini h\u0131zla de\u011fi\u015ftirdi\u011finde, her yeni karakter giri\u015finde yeni bir arama iste\u011fi tetiklenir. \u00d6nceki isteklerin iptal edilmemesi, sunucuya gereksiz y\u00fck bindirir ve istemci taraf\u0131nda g\u00fcncel olmayan verilerin g\u00f6sterilmesine neden olabilecek yar\u0131\u015f ko\u015fullar\u0131 yarat\u0131r. LazyPromise, bu t\u00fcr durumlar\u0131 zarif\u00e7e \u00e7\u00f6zerek uygulaman\u0131z\u0131n daha kararl\u0131 ve verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. \u015eimdi, LazyPromise'in temel kullan\u0131m\u0131na ve API isteklerini iptal etme senaryolar\u0131na daha yak\u0131ndan bakal\u0131m.<\/p>\n<h3>Temel Bir LazyPromise Kullan\u0131m\u0131<\/h3>\n<p>LazyPromise'in temel kullan\u0131m\u0131n\u0131 anlamak i\u00e7in basit bir \u00f6rnekle ba\u015flayal\u0131m. Bir bile\u015fen i\u00e7inde bir d\u00fc\u011fmeye t\u0131klama olay\u0131yla tetiklenen bir veri \u00e7ekme i\u015flemi d\u00fc\u015f\u00fcnelim. Amac\u0131m\u0131z, kullan\u0131c\u0131 d\u00fc\u011fmeye tekrar t\u0131klad\u0131\u011f\u0131nda \u00f6nceki iste\u011fi iptal etmektir.<\/p>\n<pre><code>\nimport { createSignal, createEffect } from 'solid-js';\nimport { LazyPromise } from 'lazy-promise';\n\nfunction FetchComponent() {\n  const [data, setData] = createSignal(null);\n  const [loading, setLoading] = createSignal(false);\n  const [error, setError] = createSignal(null);\n\n  \/\/ LazyPromise'i saklamak i\u00e7in bir sinyal\n  const [currentPromise, setCurrentPromise] = createSignal(null);\n\n  const fetchData = async () => {\n    \/\/ \u00d6nceki iste\u011fi iptal et\n    const prevPromise = currentPromise();\n    if (prevPromise) {\n      prevPromise.cancel();\n      console.log(\"\u00d6nceki istek iptal edildi.\");\n    }\n\n    setLoading(true);\n    setError(null);\n    setData(null);\n\n    \/\/ Yeni bir LazyPromise olu\u015ftur\n    const newPromise = new LazyPromise(async (resolve, reject, signal) => {\n      try {\n        console.log(\"Yeni istek ba\u015flat\u0131ld\u0131...\");\n        \/\/ API \u00e7a\u011fr\u0131s\u0131 i\u00e7in fetch kullan\u0131rken signal'i iletin\n        const response = await fetch('https:\/\/jsonplaceholder.typicode.com\/todos\/1', { signal });\n        \n        \/\/ Yan\u0131t ba\u015far\u0131l\u0131 de\u011filse hata f\u0131rlat\n        if (!response.ok) {\n          throw new Error(<code>HTTP Hata! Durum: ${response.status}<\/code>);\n        }\n        \n        const result = await response.json();\n        resolve(result);\n      } catch (err) {\n        \/\/ \u0130ptal hatas\u0131n\u0131 \u00f6zel olarak ele al\u0131n\n        if (err.name === 'AbortError') {\n          console.log(\"\u0130stek iptal edildi\u011fi i\u00e7in yakaland\u0131:\", err.message);\n          \/\/ \u0130ptal edilen istekler i\u00e7in hata g\u00f6stermemize gerek yok\n          \/\/ setLoading(false) yap\u0131labilir ama genellikle zaten bir sonraki istek devreye girer.\n          return; \/\/ \u0130ptal edilen istekler i\u00e7in Promise'i reject etmeyin\n        }\n        reject(err);\n      }\n    });\n\n    setCurrentPromise(newPromise);\n\n    newPromise\n      .then(res => {\n        setData(res);\n        setLoading(false);\n        console.log(\"\u0130stek tamamland\u0131:\", res);\n      })\n      .catch(err => {\n        \/\/ E\u011fer bir \u00f6nceki istek iptal edildiyse, bu catch blo\u011fu \u00e7al\u0131\u015fmayabilir.\n        \/\/ Ama di\u011fer hatalar (a\u011f hatas\u0131 vb.) burada yakalan\u0131r.\n        setError(err.message);\n        setLoading(false);\n        console.error(\"\u0130stek hatas\u0131:\", err);\n      });\n  };\n\n  return (\n    <div>\n      <button onClick={fetchData} disabled={loading()}>\n        {loading() ? 'Y\u00fckleniyor...' : 'Veri \u00c7ek'}\n      <\/button>\n      {error() && <p style={{ color: 'red' }}>Hata: {error()}<\/p>}\n      {data() && (\n        <div>\n          <h3>Veri:<\/h3>\n          <pre>{JSON.stringify(data(), null, 2)}<\/pre>\n<\/p><\/div>\n<p>      )}\n    <\/p><\/div>\n<p>  );<br \/>\n}<\/p>\n<p>export default FetchComponent;<br \/>\n    <\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>fetchData<\/code> fonksiyonu her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, \u00f6ncelikle \u00f6nceki <code>LazyPromise<\/code> (e\u011fer varsa) iptal edilir. Yeni bir <code>LazyPromise<\/code> olu\u015fturulur ve <code>fetch<\/code> iste\u011fine <code>signal<\/code> parametresi olarak ge\u00e7irilir. Bu, <code>LazyPromise.cancel()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda ilgili <code>fetch<\/code> iste\u011finin de iptal edilmesini sa\u011flar. <code>AbortError<\/code>, iptal edilen isteklerde do\u011fal olarak f\u0131rlat\u0131l\u0131r ve bu hata \u00f6zel olarak ele al\u0131narak UI'da bir hata mesaj\u0131 g\u00f6sterilmesi \u00f6nlenir. Bu, kullan\u0131c\u0131n\u0131n deneyimini kesintisiz hale getirir.<\/p>\n<h3>API \u0130steklerini \u0130ptal Etme Senaryolar\u0131<\/h3>\n<p>LazyPromise'i farkl\u0131 SolidJS kullan\u0131m senaryolar\u0131na entegre edebiliriz. En yayg\u0131n iki senaryo, kullan\u0131c\u0131 aray\u00fcz\u00fc etkile\u015fimleriyle tetiklenen isteklerin ve bile\u015fenin ya\u015fam d\u00f6ng\u00fcs\u00fcyle ili\u015fkili isteklerin y\u00f6netilmesidir.<\/p>\n<h4>Arama Kutusu Dinamik Veri \u00c7ekme<\/h4>\n<p>Bir arama kutusuna yazarken an\u0131nda sonu\u00e7lar getiren otomatik tamamlama (autocomplete) \u00f6zelli\u011fi, iptal edilebilir istekler i\u00e7in m\u00fckemmel bir \u00f6rnektir. Kullan\u0131c\u0131 her karakter girdi\u011finde yeni bir arama iste\u011fi tetiklenir, ancak yaln\u0131zca en son iste\u011fin sonu\u00e7lar\u0131 g\u00f6sterilmelidir. \u00d6nceki istekler ise gereksiz hale gelir.<\/p>\n<pre><code>\nimport { createSignal, createEffect } from 'solid-js';\nimport { LazyPromise } from 'lazy-promise';\n\nfunction SearchComponent() {\n  const [query, setQuery] = createSignal('');\n  const [results, setResults] = createSignal([]);\n  const [loading, setLoading] = createSignal(false);\n  const [error, setError] = createSignal(null);\n\n  let currentSearchPromise = null; \/\/ Aktif LazyPromise'i tutmak i\u00e7in\n\n  createEffect(() => {\n    const currentQuery = query();\n    if (currentQuery.length < 2) { \/\/ Minimum 2 karakterde ara\n      setResults([]);\n      return;\n    }\n\n    \/\/ \u00d6nceki iste\u011fi iptal et\n    if (currentSearchPromise) {\n      currentSearchPromise.cancel();\n      console.log(\"\u00d6nceki arama iste\u011fi iptal edildi.\");\n    }\n\n    setLoading(true);\n    setError(null);\n\n    \/\/ Debounce veya throttle kullanarak istek s\u0131kl\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz\n    \/\/ Bu \u00f6rnekte basitle\u015ftirilmi\u015f bir debounce etkisi i\u00e7in setTimeout kulland\u0131k.\n    const searchTimeout = setTimeout(() => {\n        const newPromise = new LazyPromise(async (resolve, reject, signal) => {\n            try {\n                console.log(<code>\"${currentQuery}\" i\u00e7in arama ba\u015flat\u0131ld\u0131.<\/code>);\n                \/\/ Mock API \u00e7a\u011fr\u0131s\u0131, ger\u00e7ekte bir API'ye istek g\u00f6nderirdiniz\n                const response = await fetch(\n                    <code>https:\/\/jsonplaceholder.typicode.com\/posts?q=${currentQuery}<\/code>,\n                    { signal }\n                );\n                \n                if (!response.ok) {\n                    throw new Error(<code>HTTP Hata! Durum: ${response.status}<\/code>);\n                }\n                const data = await response.json();\n                resolve(data.slice(0, 5)); \/\/ \u0130lk 5 sonucu g\u00f6ster\n            } catch (err) {\n                if (err.name === 'AbortError') {\n                    console.log(\"Arama iste\u011fi iptal edildi:\", err.message);\n                    return; \/\/ \u0130ptal edilen istek i\u00e7in hata g\u00f6sterme\n                }\n                reject(err);\n            }\n        });\n\n        currentSearchPromise = newPromise; \/\/ Yeni promise'i sakla\n\n        newPromise\n            .then(res => {\n                setResults(res);\n                setLoading(false);\n                currentSearchPromise = null; \/\/ Ba\u015far\u0131l\u0131 olunca promise'i temizle\n                console.log(<code>\"${currentQuery}\" i\u00e7in sonu\u00e7lar geldi.<\/code>);\n            })\n            .catch(err => {\n                setError(err.message);\n                setLoading(false);\n                currentSearchPromise = null; \/\/ Hata olunca promise'i temizle\n                console.error(<code>\"${currentQuery}\" i\u00e7in arama hatas\u0131:<\/code>, err);\n            });\n    }, 300); \/\/ 300ms'lik debounce s\u00fcresi\n\n    \/\/ Bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda veya query de\u011fi\u015fti\u011finde timeout'u temizle\n    return () => clearTimeout(searchTimeout);\n  });\n\n  return (\n    <div>\n      <input\n        type=\"text\"\n        placeholder=\"Arama yap...\"\n        value={query()}\n        onInput={(e) => setQuery(e.currentTarget.value)}\n      \/>\n      {loading() && <p>Y\u00fckleniyor...<\/p>}\n      {error() && <p style={{ color: 'red' }}>Hata: {error()}<\/p>}\n      <ul>\n        {results().map((post) => (\n          <li key={post.id}>{post.title}<\/li>\n        ))}\n      <\/ul>\n    <\/div>\n  );\n}\n\nexport default SearchComponent;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>createEffect<\/code> her <code>query<\/code> sinyali de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r. Yeni bir arama ba\u015flamadan \u00f6nce <code>currentSearchPromise<\/code> kontrol edilir ve e\u011fer varsa iptal edilir. Bu, \u00f6nceki arama isteklerinin tamamlanmas\u0131n\u0131 engeller ve kaynak israf\u0131n\u0131 \u00f6nler. <code>setTimeout<\/code> kullan\u0131m\u0131, basit bir debounce etkisi yaratarak gereksiz API \u00e7a\u011fr\u0131lar\u0131n\u0131 daha da azalt\u0131r.<\/p>\n<h4>Bile\u015fen Mount\/Unmount Durumlar\u0131nda \u0130stek \u0130ptali<\/h4>\n<p>Bir bile\u015fen DOM'dan kald\u0131r\u0131ld\u0131\u011f\u0131nda, o bile\u015fenin ba\u015flatt\u0131\u011f\u0131 t\u00fcm uzun s\u00fcreli asenkron i\u015flemlerin de durdurulmas\u0131 iyi bir pratiktir. SolidJS'in <code>onCleanup<\/code> kancas\u0131 ile bu i\u015flemi kolayca yapabiliriz.<\/p>\n<pre><code>\nimport { createSignal, onCleanup } from 'solid-js';\nimport { LazyPromise } from 'lazy-promise';\n\nfunction LifecycleFetchComponent() {\n  const [data, setData] = createSignal(null);\n  const [loading, setLoading] = createSignal(true);\n  const [error, setError] = createSignal(null);\n\n  \/\/ LazyPromise'i tutacak bir de\u011fi\u015fken\n  let dataFetchPromise = null;\n\n  \/\/ Bile\u015fen y\u00fcklendi\u011finde veri \u00e7ekme i\u015flemini ba\u015flat\n  \/\/ createEffect veya do\u011frudan component scope'unda \u00e7a\u011fr\u0131labilir\n  dataFetchPromise = new LazyPromise(async (resolve, reject, signal) => {\n    try {\n      console.log(\"Bile\u015fen y\u00fcklendi, veri \u00e7ekiliyor...\");\n      \/\/ Uzun s\u00fcren bir i\u015flem sim\u00fclasyonu\n      const response = await fetch('https:\/\/jsonplaceholder.typicode.com\/posts\/1', { signal });\n      \n      if (!response.ok) {\n        throw new Error(<code>HTTP Hata! Durum: ${response.status}<\/code>);\n      }\n      const result = await response.json();\n      resolve(result);\n    } catch (err) {\n      if (err.name === 'AbortError') {\n        console.log(\"Veri \u00e7ekme i\u015flemi iptal edildi (bile\u015fen kald\u0131r\u0131ld\u0131).\");\n        return;\n      }\n      reject(err);\n    }\n  });\n\n  dataFetchPromise\n    .then(res => {\n      setData(res);\n      setLoading(false);\n      console.log(\"Veri ba\u015far\u0131yla \u00e7ekildi.\");\n    })\n    .catch(err => {\n      setError(err.message);\n      setLoading(false);\n      console.error(\"Veri \u00e7ekme hatas\u0131:\", err);\n    });\n\n  \/\/ Bile\u015fen DOM'dan kald\u0131r\u0131ld\u0131\u011f\u0131nda iste\u011fi iptal et\n  onCleanup(() => {\n    if (dataFetchPromise) {\n      dataFetchPromise.cancel();\n      console.log(\"onCleanup: Devam eden veri \u00e7ekme i\u015flemi iptal edildi.\");\n    }\n  });\n\n  return (\n    <div>\n      <h3>Bile\u015fen Ya\u015fam D\u00f6ng\u00fcs\u00fc ile \u0130ptal Edilebilir \u0130stek<\/h3>\n      {loading() && <p>Y\u00fckleniyor...<\/p>}\n      {error() && <p style={{ color: 'red' }}>Hata: {error()}<\/p>}\n      {data() && (\n        <div>\n          <h4>G\u00f6nderi Detay\u0131:<\/h4>\n          <p><strong>Ba\u015fl\u0131k:<\/strong> {data().title}<\/p>\n          <p><strong>\u0130\u00e7erik:<\/strong> {data().body}<\/p>\n        <\/div>\n      )}\n    <\/div>\n  );\n}\n\nexport default LifecycleFetchComponent;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>LifecycleFetchComponent<\/code> y\u00fcklendi\u011finde bir API iste\u011fi ba\u015flat\u0131l\u0131r. E\u011fer bile\u015fen kullan\u0131c\u0131 taraf\u0131ndan DOM'dan kald\u0131r\u0131l\u0131rsa (\u00f6rne\u011fin, bir y\u00f6nlendirme veya ko\u015fullu render etme ile), <code>onCleanup<\/code> kancas\u0131 devreye girer ve devam eden <code>LazyPromise<\/code>'i iptal eder. Bu, gereksiz arka plan i\u015flemlerinin \u00e7al\u0131\u015fmas\u0131n\u0131 durdurarak uygulama kaynaklar\u0131n\u0131n verimli kullan\u0131lmas\u0131n\u0131 sa\u011flar ve olas\u0131 bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Karma\u015f\u0131k uygulamalarda, birden fazla iptal edilebilir iste\u011fi ayn\u0131 anda y\u00f6netmek i\u00e7in bir merkezi istek y\u00f6neticisi (request manager) kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu, belirli bir etiketle grupland\u0131r\u0131lm\u0131\u015f t\u00fcm istekleri tek bir \u00e7a\u011fr\u0131yla iptal etmenize olanak tan\u0131r.\n    <\/div>\n<h2>Tipli Hata Y\u00f6netimi: Sunucu Hatalar\u0131n\u0131 TypeScript ile Nas\u0131l Modellemeliyiz?<\/h2>\n<p>Uygulamalar\u0131m\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve bak\u0131ma al\u0131nabilirli\u011fini art\u0131rman\u0131n temel yollar\u0131ndan biri, sunucu hatalar\u0131n\u0131 etkili ve tutarl\u0131 bir \u015fekilde y\u00f6netmektir. TypeScript, bu s\u00fcre\u00e7te bize g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunarak, sunucudan d\u00f6nen hata yan\u0131tlar\u0131n\u0131 belirli tiplerle modellememizi sa\u011flar. Bu sayede, istemci taraf\u0131nda hatalar\u0131 daha g\u00fcvenli bir \u015fekilde i\u015fleyebilir, kullan\u0131c\u0131ya daha spesifik geri bildirimler sunabilir ve geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131rabiliriz. Genel hata mesajlar\u0131 yerine, kullan\u0131c\u0131ya sorunun ne oldu\u011funu ve nas\u0131l \u00e7\u00f6zebilece\u011fini anlatan a\u00e7\u0131k ve anlaml\u0131 mesajlar sunmak, modern web uygulamalar\u0131n\u0131n olmazsa olmaz\u0131d\u0131r.<\/p>\n<p>Sunucu hatalar\u0131n\u0131 tipli bir \u015fekilde ele alman\u0131n ilk ad\u0131m\u0131, olas\u0131 hata senaryolar\u0131n\u0131 ve bunlar\u0131n sunucu taraf\u0131ndaki yan\u0131t yap\u0131lar\u0131n\u0131 belirlemektir. \u00d6rne\u011fin, bir do\u011frulama hatas\u0131 (validation error) ile bir yetkilendirme hatas\u0131 (authentication error) farkl\u0131 bilgi setleri i\u00e7erecektir. Do\u011frulama hatas\u0131 genellikle hangi alanlar\u0131n hatal\u0131 oldu\u011funu ve hata mesajlar\u0131n\u0131 i\u00e7erirken, yetkilendirme hatas\u0131 sadece bir \"yetkisiz eri\u015fim\" mesaj\u0131 i\u00e7erebilir ve kullan\u0131c\u0131y\u0131 oturum a\u00e7maya y\u00f6nlendirmeyi gerektirebilir. Bu farkl\u0131l\u0131klar\u0131 TypeScript tipleriyle a\u00e7\u0131k\u00e7a ifade etmek, istemci kodumuzun bu durumlara daha do\u011fru ve g\u00fcvenli bir \u015fekilde tepki vermesini sa\u011flar.<\/p>\n<p>Bu yakla\u015f\u0131mla, hatalar\u0131 bir <code>any<\/code> tipi olarak ele almak yerine, belirli bir <code>interface<\/code> veya <code>type<\/code> ile tan\u0131mlar\u0131z. B\u00f6ylece, bir hata nesnesine eri\u015fti\u011fimizde, i\u00e7indeki \u00f6zelliklerin ne oldu\u011funu ve nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 derleme zaman\u0131nda biliriz. Bu sadece \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 azaltmakla kalmaz, ayn\u0131 zamanda IDE'nizde otomatik tamamlama ve IntelliSense deste\u011fi sa\u011flayarak geli\u015ftirici verimlili\u011fini de art\u0131r\u0131r. Ayr\u0131ca, hata y\u00f6netim mant\u0131\u011f\u0131n\u0131z\u0131 daha mod\u00fcler hale getirmenize ve kod taban\u0131n\u0131zda tekrar eden hata i\u015fleme bloklar\u0131n\u0131 azaltman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<p>\u015eimdi, bu prensipleri SolidJS uygulamalar\u0131m\u0131zda nas\u0131l uygulayaca\u011f\u0131m\u0131za dair pratik \u00f6rneklere ge\u00e7elim. Bir hata tipi nas\u0131l tan\u0131mlan\u0131r ve bir API iste\u011fi s\u0131ras\u0131nda bu tipler nas\u0131l kullan\u0131l\u0131r, ayr\u0131nt\u0131lar\u0131yla inceleyece\u011fiz. Ayr\u0131ca, kullan\u0131c\u0131 aray\u00fcz\u00fcnde (UI) bu tipli hata mesajlar\u0131n\u0131 nas\u0131l g\u00f6sterilece\u011fini de ele alaca\u011f\u0131z, b\u00f6ylece kullan\u0131c\u0131lar sorunlarla kar\u015f\u0131la\u015ft\u0131klar\u0131nda net ve faydal\u0131 bilgiler edinebilirler.<\/p>\n<h3>Bir Hata Tipi Tan\u0131mlama ve Kullan\u0131m\u0131<\/h3>\n<p>\u00d6ncelikle, sunucumuzdan gelebilecek farkl\u0131 hata tiplerini tan\u0131mlayal\u0131m. Genellikle bir ana hata aray\u00fcz\u00fc ve bu aray\u00fcz\u00fc geni\u015fleten \u00f6zel hata tipleri olu\u015fturmak iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code>\n\/\/ error-types.ts\nexport interface ServerError {\n  message: string;\n  code: string; \/\/ \u00d6rne\u011fin: 'VALIDATION_FAILED', 'UNAUTHORIZED', 'NOT_FOUND'\n  timestamp: string;\n}\n\nexport interface ValidationError extends ServerError {\n  code: 'VALIDATION_FAILED';\n  errors: {\n    [field: string]: string[]; \/\/ Hatal\u0131 alanlar ve mesajlar\u0131\n  };\n}\n\nexport interface UnauthorizedError extends ServerError {\n  code: 'UNAUTHORIZED';\n  \/\/ Bu hata tipi i\u00e7in ek bilgiye ihtiyac\u0131m\u0131z olmayabilir\n}\n\n\/\/ Hata tipini kontrol etmek i\u00e7in bir type guard\nexport function isValidationError(error: any): error is ValidationError {\n  return error && typeof error === 'object' && error.code === 'VALIDATION_FAILED' && 'errors' in error;\n}\n\nexport function isUnauthorizedError(error: any): error is UnauthorizedError {\n  return error && typeof error === 'object' && error.code === 'UNAUTHORIZED';\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, bu hata tiplerini kullanarak bir API iste\u011fi yapal\u0131m ve hata durumlar\u0131n\u0131 ele alal\u0131m.<\/p>\n<pre><code>\n\/\/ dataService.ts\nimport { LazyPromise } from 'lazy-promise';\nimport { ServerError, ValidationError, isValidationError } from '.\/error-types';\n\ninterface User {\n  id: string;\n  name: string;\n  email: string;\n}\n\n\/\/ Mock API Fonksiyonu\nexport function createUser(userData: { name: string; email: string }, signal: AbortSignal): LazyPromise<User, ServerError> {\n  return new LazyPromise(async (resolve, reject) => {\n    try {\n      \/\/ API \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\n      const response = await fetch('\/api\/users', { \/\/ Bu bir mock endpoint olabilir\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify(userData),\n        signal,\n      });\n\n      if (!response.ok) {\n        const errorData = await response.json() as ServerError; \/\/ Sunucu hatas\u0131n\u0131 tipli olarak yakala\n        reject(errorData); \/\/ Hata objesini reject et\n        return;\n      }\n\n      const newUser = await response.json() as User;\n      resolve(newUser);\n    } catch (err) {\n      if (err.name === 'AbortError') {\n        console.log(\"Kullan\u0131c\u0131 olu\u015fturma iste\u011fi iptal edildi.\");\n        return; \/\/ \u0130ptal edilen istek i\u00e7in reject etmeyin\n      }\n      \/\/ Di\u011fer a\u011f veya istemci taraf\u0131 hatalar\u0131 i\u00e7in genel bir ServerError olu\u015ftur\n      reject({ message: err.message || 'Bilinmeyen bir hata olu\u015ftu.', code: 'UNKNOWN_ERROR', timestamp: new Date().toISOString() });\n    }\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>createUser<\/code> fonksiyonunda, <code>LazyPromise<\/code>'in ikinci tipi (Promise'in reject de\u011feri i\u00e7in) <code>ServerError<\/code> olarak belirtilmi\u015ftir. E\u011fer API yan\u0131t\u0131 <code>!response.ok<\/code> ise, d\u00f6nen JSON objesini do\u011frudan <code>ServerError<\/code> tipine cast ediyoruz. Bu sayede, hatay\u0131 yakalayan kod blo\u011fu bu hatan\u0131n yap\u0131s\u0131n\u0131 TypeScript sayesinde bilecektir.<\/p>\n<h3>UI'da Hata Mesajlar\u0131n\u0131 G\u00f6sterme<\/h3>\n<p>SolidJS bile\u015fenimizde bu tipli hatalar\u0131 nas\u0131l yakalay\u0131p kullan\u0131c\u0131ya g\u00f6sterece\u011fimize bakal\u0131m:<\/p>\n<pre><code>\nimport { createSignal } from 'solid-js';\nimport { createUser } from '.\/dataService'; \/\/ Yukar\u0131daki servis fonksiyonu\nimport { ServerError, ValidationError, isValidationError, isUnauthorizedError } from '.\/error-types';\n\nfunction UserRegistrationForm() {\n  const [name, setName] = createSignal('');\n  const [email, setEmail] = createSignal('');\n  const [loading, setLoading] = createSignal(false);\n  const [globalError, setGlobalError] = createSignal<ServerError | null>(null);\n  const [fieldErrors, setFieldErrors] = createSignal<{[key: string]: string[]}>({});\n  const [successMessage, setSuccessMessage] = createSignal('');\n\n  let currentCreateUserPromise: LazyPromise<any, ServerError> | null = null;\n\n  const handleSubmit = async (e: Event) => {\n    e.preventDefault();\n\n    if (currentCreateUserPromise) {\n      currentCreateUserPromise.cancel();\n    }\n\n    setLoading(true);\n    setGlobalError(null);\n    setFieldErrors({});\n    setSuccessMessage('');\n\n    currentCreateUserPromise = createUser({ name: name(), email: email() }, new AbortController().signal);\n\n    currentCreateUserPromise\n      .then(user => {\n        setSuccessMessage(<code>Kullan\u0131c\u0131 ${user.name} ba\u015far\u0131yla olu\u015fturuldu!<\/code>);\n        setName('');\n        setEmail('');\n        setLoading(false);\n        currentCreateUserPromise = null;\n      })\n      .catch(error => {\n        \/\/ Hata objesinin tipini kontrol et\n        if (isValidationError(error)) {\n          \/\/ Do\u011frulama hatas\u0131 ise alan baz\u0131nda g\u00f6ster\n          setFieldErrors(error.errors);\n          setGlobalError({ ...error, message: 'L\u00fctfen formdaki hatalar\u0131 d\u00fczeltin.' });\n        } else if (isUnauthorizedError(error)) {\n          \/\/ Yetkilendirme hatas\u0131 ise kullan\u0131c\u0131y\u0131 login sayfas\u0131na y\u00f6nlendir veya mesaj g\u00f6ster\n          setGlobalError({ ...error, message: 'Oturumunuz sona ermi\u015f veya yetkiniz yok. L\u00fctfen tekrar giri\u015f yap\u0131n.' });\n          \/\/ navigate('\/login'); \/\/ \u00d6rne\u011fin\n        } else {\n          \/\/ Di\u011fer t\u00fcm sunucu hatalar\u0131 i\u00e7in genel mesaj\n          setGlobalError(error);\n        }\n        setLoading(false);\n        currentCreateUserPromise = null;\n        console.error(\"Kullan\u0131c\u0131 olu\u015fturma hatas\u0131:\", error);\n      });\n  };\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <h2>Yeni Kullan\u0131c\u0131 Kayd\u0131<\/h2>\n      {successMessage() && <p style={{ color: 'green' }}>{successMessage()}<\/p>}\n      {globalError() && <p style={{ color: 'red' }}>Hata ({globalError()?.code}): {globalError()?.message}<\/p>}\n\n      <div>\n        <label for=\"name\">Ad:<\/label>\n        <input id=\"name\" type=\"text\" value={name()} onInput={(e) => setName(e.currentTarget.value)} \/>\n        {fieldErrors().name && <p style={{ color: 'orange' }}>{fieldErrors().name.join(', ')}<\/p>}\n      <\/div>\n\n      <div>\n        <label for=\"email\">E-posta:<\/label>\n        <input id=\"email\" type=\"email\" value={email()} onInput={(e) => setEmail(e.currentTarget.value)} \/>\n        {fieldErrors().email && <p style={{ color: 'orange' }}>{fieldErrors().email.join(', ')}<\/p>}\n      <\/div>\n\n      <button type=\"submit\" disabled={loading()}>\n        {loading() ? 'Kaydediliyor...' : 'Kaydol'}\n      <\/button>\n    <\/form>\n  );\n}\n\nexport default UserRegistrationForm;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>.catch()<\/code> blo\u011funda <code>isValidationError<\/code> ve <code>isUnauthorizedError<\/code> gibi type guard'lar\u0131 kullanarak gelen hatan\u0131n tipini g\u00fcvenli bir \u015fekilde kontrol ediyoruz. Bu sayede:<\/p>\n<ul>\n<li><code>ValidationError<\/code> durumunda, spesifik alan hatalar\u0131n\u0131 <code>fieldErrors<\/code> sinyeline atayarak ilgili input alanlar\u0131n\u0131n alt\u0131nda g\u00f6sterebiliyoruz.<\/li>\n<li><code>UnauthorizedError<\/code> durumunda, kullan\u0131c\u0131ya \u00f6zel bir mesaj g\u00f6sterip belki de giri\u015f sayfas\u0131na y\u00f6nlendirme gibi ek bir i\u015flem yapabiliyoruz.<\/li>\n<li>Di\u011fer genel <code>ServerError<\/code> durumlar\u0131 i\u00e7in ise daha genel bir hata mesaj\u0131 sunuyoruz.<\/li>\n<\/ul>\n<p>Bu tipli yakla\u015f\u0131m, hatalar\u0131 tutarl\u0131, okunabilir ve y\u00f6netilebilir bir \u015fekilde ele almam\u0131z\u0131 sa\u011flar. Hata durumlar\u0131n\u0131n \u00f6nceden tan\u0131mlanm\u0131\u015f olmas\u0131, hem geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r hem de uygulaman\u0131n daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Uzun S\u00fcreli Veri \u00c7ekme \u0130\u015flemlerinde Performans ve Kullan\u0131c\u0131 Deneyimi Nas\u0131l \u0130yile\u015ftirilir?<\/h2>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, kullan\u0131c\u0131lar\u0131n yava\u015f veya tak\u0131lgan bir aray\u00fczle kar\u015f\u0131la\u015fmas\u0131n\u0131 engellemek kritik \u00f6neme sahiptir. \u00d6zellikle uzun s\u00fcreli veri \u00e7ekme i\u015flemleri, kullan\u0131c\u0131n\u0131n sabr\u0131n\u0131 zorlayabilir ve uygulaman\u0131n genel performans alg\u0131s\u0131n\u0131 d\u00fc\u015f\u00fcrebilir. \u0130ptal edilebilir asenkron g\u00f6revler ve tipli hata y\u00f6netimi, bu t\u00fcr senaryolarda hem performans\u0131 hem de kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftiren temel ara\u00e7lard\u0131r. Bu b\u00f6l\u00fcmde, iki yayg\u0131n ger\u00e7ek d\u00fcnya senaryosu \u00fczerinden bu yakla\u015f\u0131mlar\u0131n pratik faydalar\u0131n\u0131 inceleyece\u011fiz: dinamik bir arama kutusunun performans\u0131 ve dosya y\u00fckleme i\u015flemlerindeki kullan\u0131c\u0131 geri bildirimi ve iptal mekanizmalar\u0131.<\/p>\n<p>Uzun s\u00fcreli i\u015flemlerin y\u00f6netimi, sadece teknik bir gereklilik de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 psikolojisiyle de ilgilidir. Bir i\u015flem ba\u015flad\u0131\u011f\u0131nda, kullan\u0131c\u0131ya geri bildirim vermek (y\u00fckleme g\u00f6stergeleri, ilerleme \u00e7ubuklar\u0131) ve i\u015flemi iptal etme olana\u011f\u0131 sunmak, kullan\u0131c\u0131n\u0131n kontrol hissini art\u0131r\u0131r ve bekleyi\u015fin stresini azalt\u0131r. E\u011fer bir i\u015flem gereksiz hale gelirse ve otomatik olarak iptal edilmezse, bu durum hem istemci kaynaklar\u0131n\u0131 (CPU, bellek, a\u011f bant geni\u015fli\u011fi) hem de sunucu kaynaklar\u0131n\u0131 (i\u015flem g\u00fcc\u00fc, veritaban\u0131 sorgular\u0131) bo\u015fa harcar. Bu, \u00f6zellikle y\u00fcksek trafikli uygulamalarda veya mobil cihazlarda enerji t\u00fcketimi a\u00e7\u0131s\u0131ndan bile \u00f6nemli hale gelebilir.<\/p>\n<p>Tipli hata y\u00f6netimi ise, bu i\u015flemler s\u0131ras\u0131nda meydana gelebilecek sorunlar\u0131 kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r bir dilde aktarmak i\u00e7in kullan\u0131l\u0131r. Bir dosya y\u00fcklenirken \"Dosya boyutu \u00e7ok b\u00fcy\u00fck\" veya \"Ge\u00e7ersiz dosya tipi\" gibi spesifik bir hata mesaj\u0131 almak, kullan\u0131c\u0131 i\u00e7in genel bir \"Y\u00fckleme hatas\u0131\" mesaj\u0131ndan \u00e7ok daha de\u011ferlidir. Bu, kullan\u0131c\u0131n\u0131n sorunu h\u0131zla anlamas\u0131na ve do\u011fru ad\u0131mlar\u0131 atmas\u0131na yard\u0131mc\u0131 olur. Aksi takdirde, kullan\u0131c\u0131 ne yapaca\u011f\u0131n\u0131 bilemez ve uygulamadan uzakla\u015fabilir.<\/p>\n<p>Bu senaryolar, SolidJS'in reaktivitesini LazyPromise'in iptal mekanizmas\u0131 ve TypeScript'in tip g\u00fcvenli\u011fi ile birle\u015ftirmenin ger\u00e7ek de\u011ferini g\u00f6sterir. Amac\u0131m\u0131z, sadece i\u015flevsel uygulamalar olu\u015fturmak de\u011fil, ayn\u0131 zamanda her etkile\u015fimde kullan\u0131c\u0131ya sorunsuz ve g\u00fcven verici bir deneyim sunmakt\u0131r. \u015eimdi, bu kavramlar\u0131 somutla\u015ft\u0131rmak i\u00e7in iki \u00f6rnek senaryoya daha derinlemesine bakal\u0131m.<\/p>\n<h3>Arama Kutusu \u00d6rne\u011fi<\/h3>\n<p>Bir e-ticaret sitesindeki \u00fcr\u00fcn arama kutusu veya bir dok\u00fcman y\u00f6netim sistemindeki belge arama \u00f6zelli\u011fi, iptal edilebilir isteklerin en bilinen kullan\u0131m alanlar\u0131ndan biridir. Kullan\u0131c\u0131lar genellikle arama terimlerini h\u0131zla de\u011fi\u015ftirirler ve her tu\u015f vuru\u015funda bir API iste\u011fi g\u00f6ndermek yerine, sadece son ve g\u00fcncel iste\u011fin sonu\u00e7lar\u0131n\u0131n g\u00f6sterilmesi beklenir.<\/p>\n<pre><code>\nimport { createSignal, createEffect, onCleanup } from 'solid-js';\nimport { LazyPromise } from 'lazy-promise';\n\ninterface Product {\n  id: string;\n  name: string;\n  price: number;\n}\n\nfunction ProductSearch() {\n  const [searchTerm, setSearchTerm] = createSignal('');\n  const [searchResults, setSearchResults] = createSignal<Product[]>([]);\n  const [loading, setLoading] = createSignal(false);\n  const [error, setError] = createSignal<string | null>(null);\n\n  let currentSearchPromise: LazyPromise<Product[], string> | null = null;\n  let debounceTimeout: NodeJS.Timeout | null = null;\n\n  createEffect(() => {\n    const currentTerm = searchTerm();\n    if (currentTerm.length < 3) {\n      setSearchResults([]);\n      setError(null);\n      if (currentSearchPromise) {\n        currentSearchPromise.cancel();\n        currentSearchPromise = null;\n      }\n      if (debounceTimeout) {\n        clearTimeout(debounceTimeout);\n      }\n      return;\n    }\n\n    setLoading(true);\n    setError(null);\n\n    \/\/ \u00d6nceki debounce timeout'u temizle\n    if (debounceTimeout) {\n      clearTimeout(debounceTimeout);\n    }\n\n    debounceTimeout = setTimeout(() => {\n      \/\/ \u00d6nceki iste\u011fi iptal et\n      if (currentSearchPromise) {\n        currentSearchPromise.cancel();\n        console.log(<code>Eski arama \"${searchTerm()}\" iptal edildi.<\/code>);\n      }\n\n      const newSearchPromise = new LazyPromise<Product[], string>(async (resolve, reject, signal) => {\n        try {\n          console.log(<code>Yeni arama ba\u015flat\u0131ld\u0131: \"${currentTerm}\"<\/code>);\n          \/\/ API \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\n          const response = await fetch(<code>https:\/\/api.example.com\/products?q=${currentTerm}<\/code>, { signal });\n\n          if (!response.ok) {\n            throw new Error(<code>\u00dcr\u00fcn arama hatas\u0131: ${response.status}<\/code>);\n          }\n          const data = await response.json();\n          resolve(data as Product[]);\n        } catch (err) {\n          if (err.name === 'AbortError') {\n            console.log(\"\u00dcr\u00fcn arama iste\u011fi iptal edildi.\");\n            return;\n          }\n          reject(err.message || \"Bilinmeyen bir hata olu\u015ftu.\");\n        }\n      });\n\n      currentSearchPromise = newSearchPromise;\n\n      newSearchPromise\n        .then(res => {\n          setSearchResults(res);\n          setLoading(false);\n          currentSearchPromise = null;\n        })\n        .catch(err => {\n          setError(err);\n          setLoading(false);\n          currentSearchPromise = null;\n        });\n    }, 500); \/\/ 500ms debounce\n  });\n\n  onCleanup(() => {\n    if (currentSearchPromise) {\n      currentSearchPromise.cancel();\n    }\n    if (debounceTimeout) {\n      clearTimeout(debounceTimeout);\n    }\n  });\n\n  return (\n    <div style=\"padding: 20px; max-width: 600px; margin: auto;\">\n      <input\n        type=\"text\"\n        placeholder=\"\u00dcr\u00fcn Ara...\"\n        value={searchTerm()}\n        onInput={(e) => setSearchTerm(e.currentTarget.value)}\n        style=\"width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px;\"\n      \/>\n      {loading() && <p style=\"color: #007bff;\">\u00dcr\u00fcnler aran\u0131yor...<\/p>}\n      {error() && <p style=\"color: red;\">Hata: {error()}<\/p>}\n      {searchResults().length > 0 ? (\n        <ul style=\"list-style: none; padding: 0;\">\n          {searchResults().map(product => (\n            <li key={product.id} style=\"background: #f8f9fa; margin-bottom: 8px; padding: 10px; border-radius: 4px; border: 1px solid #eee;\">\n              {product.name} - ${product.price.toFixed(2)}\n            <\/li>\n          ))}\n        <\/ul>\n      ) : (\n        searchTerm().length >= 3 && !loading() && !error() && <p>Sonu\u00e7 bulunamad\u0131.<\/p>\n      )}\n    <\/div>\n  );\n}\n\nexport default ProductSearch;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, her <code>searchTerm<\/code> de\u011fi\u015fikli\u011finde yeni bir LazyPromise ba\u015flat\u0131l\u0131rken, \u00f6nceki promise iptal edilir. Ayr\u0131ca, <code>debounceTimeout<\/code> ile gereksiz API \u00e7a\u011fr\u0131lar\u0131 engellenir. Bu sayede:<\/p>\n<ul>\n<li>Kullan\u0131c\u0131 h\u0131zl\u0131 yazd\u0131\u011f\u0131nda sadece son iste\u011fin sonu\u00e7lar\u0131 i\u015flenir.<\/li>\n<li>Sunucu \u00fczerindeki y\u00fck azal\u0131r.<\/li>\n<li>UI gereksiz g\u00fcncellemelerden ka\u00e7\u0131n\u0131r ve daha duyarl\u0131 kal\u0131r.<\/li>\n<\/ul>\n<h3>Dosya Y\u00fckleme \u0130lerlemesi ve \u0130ptali<\/h3>\n<p>B\u00fcy\u00fck dosyalar\u0131n y\u00fcklenmesi, uzun s\u00fcren bir i\u015flemdir ve kullan\u0131c\u0131ya ilerleme durumu hakk\u0131nda geri bildirim sa\u011flamak ve y\u00fcklemeyi iptal etme yetene\u011fi sunmak kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<pre><code>\nimport { createSignal, onCleanup } from 'solid-js';\nimport { LazyPromise } from 'lazy-promise';\nimport { ServerError } from '.\/error-types'; \/\/ Tipli hata tan\u0131mlamalar\u0131n\u0131z\n\nfunction FileUploader() {\n  const [file, setFile] = createSignal<File | null>(null);\n  const [uploadProgress, setUploadProgress] = createSignal(0);\n  const [loading, setLoading] = createSignal(false);\n  const [error, setError] = createSignal<ServerError | null>(null);\n  const [uploadSuccess, setUploadSuccess] = createSignal(false);\n\n  let currentUploadPromise: LazyPromise<string, ServerError> | null = null;\n  let abortController: AbortController | null = null;\n\n  const handleFileChange = (e: Event) => {\n    const target = e.target as HTMLInputElement;\n    if (target.files && target.files[0]) {\n      setFile(target.files[0]);\n      setUploadProgress(0);\n      setError(null);\n      setUploadSuccess(false);\n    }\n  };\n\n  const startUpload = () => {\n    if (!file()) return;\n\n    \/\/ \u00d6nceki y\u00fcklemeyi iptal et (varsa)\n    if (currentUploadPromise) {\n      currentUploadPromise.cancel();\n      console.log(\"\u00d6nceki dosya y\u00fckleme i\u015flemi iptal edildi.\");\n    }\n    \n    abortController = new AbortController(); \/\/ Her yeni y\u00fckleme i\u00e7in yeni AbortController\n    const signal = abortController.signal;\n\n    setLoading(true);\n    setError(null);\n    setUploadSuccess(false);\n\n    currentUploadPromise = new LazyPromise<string, ServerError>(async (resolve, reject) => {\n      try {\n        console.log(<code>\"${file()?.name}\" dosyas\u0131 y\u00fckleniyor...<\/code>);\n        const formData = new FormData();\n        formData.append('file', file() as File);\n\n        const xhr = new XMLHttpRequest(); \/\/ \u0130lerleme takibi i\u00e7in XMLHttpRequest kullan\u0131yoruz\n        xhr.open('POST', '\/api\/upload', true);\n        xhr.responseType = 'json'; \/\/ Sunucudan JSON yan\u0131t bekliyoruz\n\n        \/\/ \u0130ptal sinyalini dinle\n        signal.addEventListener('abort', () => xhr.abort());\n\n        xhr.upload.onprogress = (event) => {\n          if (event.lengthComputable) {\n            const percentCompleted = Math.round((event.loaded * 100) \/ event.total);\n            setUploadProgress(percentCompleted);\n          }\n        };\n\n        xhr.onload = () => {\n          if (xhr.status >= 200 && xhr.status < 300) {\n            resolve(xhr.response.message || 'Dosya ba\u015far\u0131yla y\u00fcklendi.');\n          } else {\n            \/\/ Sunucudan gelen tipli hatay\u0131 yakala\n            reject(xhr.response as ServerError);\n          }\n        };\n\n        xhr.onerror = () => {\n          \/\/ A\u011f hatas\u0131 veya ba\u015fka bir hata\n          reject({ message: 'A\u011f hatas\u0131 veya sunucuya ula\u015f\u0131lam\u0131yor.', code: 'NETWORK_ERROR', timestamp: new Date().toISOString() });\n        };\n\n        xhr.send(formData);\n\n      } catch (err) {\n        if (err.name === 'AbortError') {\n          console.log(\"Dosya y\u00fckleme iptal edildi.\");\n          return;\n        }\n        reject({ message: err.message || 'Y\u00fckleme s\u0131ras\u0131nda beklenmeyen bir hata olu\u015ftu.', code: 'UNKNOWN_UPLOAD_ERROR', timestamp: new Date().toISOString() });\n      }\n    });\n\n    currentUploadPromise\n      .then(message => {\n        setUploadSuccess(true);\n        setLoading(false);\n        setUploadProgress(100); \/\/ Ba\u015far\u0131l\u0131 olunca %100 yap\n        console.log(message);\n        currentUploadPromise = null;\n        abortController = null;\n      })\n      .catch(err => {\n        setError(err);\n        setLoading(false);\n        setUploadProgress(0); \/\/ Hata olunca ilerlemeyi s\u0131f\u0131rla\n        console.error(\"Dosya y\u00fckleme hatas\u0131:\", err);\n        currentUploadPromise = null;\n        abortController = null;\n      });\n  };\n\n  const cancelUpload = () => {\n    if (abortController) {\n      abortController.abort();\n      console.log(\"Kullan\u0131c\u0131 taraf\u0131ndan y\u00fckleme iptal edildi.\");\n      setLoading(false);\n      setUploadProgress(0);\n      setError({ message: 'Dosya y\u00fckleme i\u015flemi kullan\u0131c\u0131 taraf\u0131ndan iptal edildi.', code: 'USER_CANCELLED', timestamp: new Date().toISOString() });\n      currentUploadPromise = null;\n      abortController = null;\n    }\n  };\n\n  onCleanup(() => {\n    if (currentUploadPromise) {\n      currentUploadPromise.cancel();\n    }\n    if (abortController) {\n        abortController.abort(); \/\/ Bile\u015fen kald\u0131r\u0131l\u0131rsa XHR iste\u011fini de iptal et\n    }\n  });\n\n  \/\/ Mobile uyumlu stil i\u00e7in basit bir \u00f6rnek\n  const progressBarWidth = () => <code>${uploadProgress()}%<\/code>;\n  const isMobile = window.matchMedia(\"(max-width: 768px)\").matches;\n\n  return (\n    <div style={{ padding: '20px', maxWidth: '500px', margin: 'auto', border: '1px solid #eee', 'border-radius': '8px', 'box-shadow': '0 2px 5px rgba(0,0,0,0.1)' }}>\n      <h2>Dosya Y\u00fckleyici<\/h2>\n      <input type=\"file\" onChange={handleFileChange} \/>\n      {file() && <p>Se\u00e7ilen dosya: <strong>{file()?.name}<\/strong><\/p>}\n\n      <button onClick={startUpload} disabled={!file() || loading()} style={{ 'margin-top': '15px', padding: '10px 20px', 'background-color': '#28a745', color: 'white', border: 'none', 'border-radius': '5px', cursor: 'pointer', opacity: (!file() || loading()) ? 0.6 : 1 }}>\n        {loading() ? 'Y\u00fckleniyor...' : 'Y\u00fcklemeyi Ba\u015flat'}\n      <\/button>\n      <button onClick={cancelUpload} disabled={!loading()} style={{ 'margin-top': '15px', 'margin-left': '10px', padding: '10px 20px', 'background-color': '#dc3545', color: 'white', border: 'none', 'border-radius': '5px', cursor: 'pointer', opacity: (!loading()) ? 0.6 : 1 }}>\n        \u0130ptal Et\n      <\/button>\n\n      {loading() && (\n        <div style={{ 'margin-top': '20px', 'background-color': '#e9ecef', 'border-radius': '5px', height: '20px', overflow: 'hidden' }}>\n          <div\n            style={{\n              width: progressBarWidth(),\n              height: '100%',\n              'background-color': '#007bff',\n              'transition': 'width 0.3s ease-in-out',\n              'display': 'flex',\n              'align-items': 'center',\n              'justify-content': 'center',\n              color: 'white',\n              'font-size': '0.8em',\n            }}\n          >\n            {uploadProgress()}%\n          <\/div>\n        <\/div>\n      )}\n\n      {error() && <p style={{ color: 'red', 'margin-top': '15px' }}>Hata ({error()?.code}): {error()?.message}<\/p>}\n      {uploadSuccess() && <p style={{ color: 'green', 'margin-top': '15px' }}>Dosya ba\u015far\u0131yla y\u00fcklendi!<\/p>}\n\n      {\/* Mobile uyumlu HTML \u00f6rne\u011fi: Media Query ile stil de\u011fi\u015ftirme *\/}\n      <style>\n        {<code>@media (max-width: 768px) {\n            div {\n              padding: 10px;\n            }\n            input[type=\"file\"], button {\n              width: 100%;\n              margin-left: 0 !important;\n              margin-bottom: 10px;\n            }\n          }<\/code>}\n      <\/style>\n    <\/div>\n  );\n}\n\nexport default FileUploader;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu karma\u015f\u0131k \u00f6rnekte, <code>XMLHttpRequest<\/code> API'si kullan\u0131larak dosya y\u00fckleme ilerlemesi takip edilir. LazyPromise, y\u00fckleme i\u015flemini iptal etme yetene\u011fi sa\u011flar. Ayr\u0131ca:<\/p>\n<ul>\n<li><code>uploadProgress<\/code> sinyali ile y\u00fckleme ilerlemesi kullan\u0131c\u0131ya g\u00f6rsel olarak sunulur.<\/li>\n<li><code>cancelUpload<\/code> fonksiyonu, devam eden y\u00fcklemeyi <code>AbortController<\/code> arac\u0131l\u0131\u011f\u0131yla durdurur.<\/li>\n<li>Sunucudan d\u00f6nen hata tipleri (\u00f6rne\u011fin dosya boyutu, format hatalar\u0131) <code>ServerError<\/code> aray\u00fcz\u00fc ile ele al\u0131n\u0131r.<\/li>\n<li><code>onCleanup<\/code> ile bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda y\u00fckleme i\u015flemi de otomatik olarak iptal edilir.<\/li>\n<li>Basit bir medya sorgusu (media query) \u00f6rne\u011fi ile mobil cihazlarda buton ve inputlar\u0131n tam geni\u015flikte g\u00f6sterilmesi sa\u011flan\u0131r, b\u00f6ylece mobil uyumluluk vurgulan\u0131r.<\/li>\n<\/ul>\n<p>Bu senaryolar, LazyPromise ve tipli hata y\u00f6netiminin sadece kod temizli\u011fi sa\u011flamakla kalmay\u0131p, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n uygulamalar\u0131n\u0131zla nas\u0131l etkile\u015fim kurdu\u011funu do\u011frudan iyile\u015ftirdi\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu, modern web geli\u015ftirmenin temel bir par\u00e7as\u0131d\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: Daha Karma\u015f\u0131k Ak\u0131\u015flarda LazyPromise ve Hata Y\u00f6netimi \u0130\u00e7in P\u00fcf Noktalar\u0131 Nelerdir?<\/h2>\n<p>LazyPromise ve tipli hata y\u00f6netimi ile SolidJS uygulamalar\u0131n\u0131z\u0131n temellerini sa\u011flamla\u015ft\u0131rd\u0131ktan sonra, daha karma\u015f\u0131k senaryolarla kar\u015f\u0131la\u015fman\u0131z ka\u00e7\u0131n\u0131lmazd\u0131r. \u00c7oklu ba\u011f\u0131ml\u0131 istekler, k\u00fcresel hata i\u015fleme stratejileri veya \u00f6zel iptal mekanizmalar\u0131 gibi ileri d\u00fczey konular, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini ve bak\u0131m kolayl\u0131\u011f\u0131n\u0131 do\u011frudan etkiler. Bu b\u00f6l\u00fcmde, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in kullanabilece\u011finiz baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<p>\u00d6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, asenkron i\u015flemlerin y\u00f6netimi sadece bireysel bile\u015fenlerle s\u0131n\u0131rl\u0131 kalmayabilir. Bazen birden fazla API \u00e7a\u011fr\u0131s\u0131n\u0131n ard\u0131\u015f\u0131k olarak veya paralel olarak tamamlanmas\u0131 gerekebilir ve bu zincirdeki herhangi bir ad\u0131m\u0131n ba\u015far\u0131s\u0131z olmas\u0131 durumunda veya t\u00fcm zincirin iptal edilmesi gerekti\u011finde nas\u0131l davran\u0131laca\u011f\u0131n\u0131 belirlemek \u00f6nemlidir. Bu t\u00fcr senaryolarda, Promise zincirlerini y\u00f6netmek ve merkezi bir hata i\u015fleme stratejisi benimsemek, kod tekrar\u0131n\u0131 azalt\u0131r ve uygulaman\u0131n genel hata tolerans\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>LazyPromise'in esnek yap\u0131s\u0131, yaln\u0131zca basit API \u00e7a\u011fr\u0131lar\u0131n\u0131 de\u011fil, ayn\u0131 zamanda daha karma\u015f\u0131k arka plan g\u00f6revlerini (\u00f6rne\u011fin, b\u00fcy\u00fck veri setlerini i\u015fleme, uzun s\u00fcreli WebSocket ba\u011flant\u0131lar\u0131n\u0131 y\u00f6netme) de iptal edilebilir hale getirmek i\u00e7in kullan\u0131labilir. <code>AbortSignal<\/code>'\u0131 sadece <code>fetch<\/code> API'si ile de\u011fil, ayn\u0131 zamanda di\u011fer taray\u0131c\u0131 API'leri veya kendi \u00f6zel asenkron i\u015flevlerinizle de entegre etmek m\u00fcmk\u00fcnd\u00fcr. Bu, uygulaman\u0131za daha fazla kontrol ve esneklik kazand\u0131r\u0131r.<\/p>\n<p>Ayr\u0131ca, geli\u015ftirici deneyimini iyile\u015ftirmek i\u00e7in hata tiplerinizi daha da geni\u015fletebilir ve sunucunuzdan d\u00f6nen hata yan\u0131tlar\u0131na dayal\u0131 olarak \u00f6zel hata s\u0131n\u0131flar\u0131 olu\u015fturabilirsiniz. Bu s\u0131n\u0131flar, hatay\u0131 hem tipli olarak tan\u0131mlaman\u0131za hem de ilgili i\u015flevselli\u011fi (\u00f6rne\u011fin, hata mesaj\u0131n\u0131 formatlama, belirli loglama i\u015flemleri) kaps\u00fcllemenize olanak tan\u0131r. B\u00f6ylece, hata i\u015fleme mant\u0131\u011f\u0131n\u0131z daha okunabilir, test edilebilir ve yeniden kullan\u0131labilir hale gelir. \u0130\u015fte bu ileri d\u00fczey tekniklerin baz\u0131lar\u0131na daha yak\u0131ndan bir bak\u0131\u015f.<\/p>\n<h3>\u00c7oklu Ba\u011f\u0131ml\u0131 \u0130steklerin \u0130ptali ve Y\u00f6netimi<\/h3>\n<p>Bazen bir iste\u011fin sonucu, ba\u015fka bir iste\u011fin parametresi olarak kullan\u0131l\u0131r. Bu gibi ba\u011f\u0131ml\u0131 istek zincirlerinde, zincirdeki herhangi bir iste\u011fin iptal edilmesi, sonraki t\u00fcm isteklerin de iptal edilmesini gerektirebilir. LazyPromise, bu t\u00fcr senaryolar i\u00e7in esnek bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<pre><code>\nimport { createSignal } from 'solid-js';\nimport { LazyPromise } from 'lazy-promise';\nimport { ServerError } from '.\/error-types'; \/\/ Mevcut hata tipleriniz\n\ninterface UserProfile {\n  id: string;\n  name: string;\n  posts: Array<{ id: string; title: string }>;\n}\n\nfunction fetchUserProfile(userId: string, signal: AbortSignal): LazyPromise<UserProfile, ServerError> {\n  return new LazyPromise(async (resolve, reject) => {\n    try {\n      \/\/ 1. Kullan\u0131c\u0131 bilgilerini \u00e7ek\n      const userResponse = await fetch(<code>https:\/\/api.example.com\/users\/${userId}<\/code>, { signal });\n      if (!userResponse.ok) throw await userResponse.json() as ServerError;\n      const user = await userResponse.json();\n\n      \/\/ 2. Kullan\u0131c\u0131n\u0131n g\u00f6nderilerini \u00e7ek (ilk iste\u011fe ba\u011f\u0131ml\u0131)\n      const postsResponse = await fetch(<code>https:\/\/api.example.com\/users\/${userId}\/posts<\/code>, { signal });\n      if (!postsResponse.ok) throw await postsResponse.json() as ServerError;\n      const posts = await postsResponse.json();\n\n      resolve({ ...user, posts });\n    } catch (err) {\n      if (err.name === 'AbortError') {\n        console.log(\"Kullan\u0131c\u0131 profili ve g\u00f6nderileri \u00e7ekme i\u015flemi iptal edildi.\");\n        return;\n      }\n      reject(err);\n    }\n  });\n}\n\nfunction ProfileComponent() {\n  const [profile, setProfile] = createSignal<UserProfile | null>(null);\n  const [loading, setLoading] = createSignal(false);\n  const [error, setError] = createSignal<ServerError | null>(null);\n  const [userId, setUserId] = createSignal('123'); \/\/ \u00d6rnek kullan\u0131c\u0131 ID\n\n  let profileFetchPromise: LazyPromise<UserProfile, ServerError> | null = null;\n\n  const loadProfile = () => {\n    if (profileFetchPromise) {\n      profileFetchPromise.cancel();\n    }\n\n    setLoading(true);\n    setError(null);\n    setProfile(null);\n\n    profileFetchPromise = fetchUserProfile(userId(), new AbortController().signal);\n\n    profileFetchPromise\n      .then(data => {\n        setProfile(data);\n        setLoading(false);\n        profileFetchPromise = null;\n      })\n      .catch(err => {\n        setError(err);\n        setLoading(false);\n        profileFetchPromise = null;\n        console.error(\"Profil y\u00fckleme hatas\u0131:\", err);\n      });\n  };\n\n  return (\n    <div>\n      <input type=\"text\" value={userId()} onInput={(e) => setUserId(e.currentTarget.value)} \/>\n      <button onClick={loadProfile} disabled={loading()}>\n        {loading() ? 'Y\u00fckleniyor...' : 'Profili Y\u00fckle'}\n      <\/button>\n      {loading() && <p>Profil y\u00fckleniyor...<\/p>}\n      {error() && <p style={{ color: 'red' }}>Hata ({error()?.code}): {error()?.message}<\/p>}\n      {profile() && (\n        <div>\n          <h3>{profile()?.name} Profili<\/h3>\n          <p>ID: {profile()?.id}<\/p>\n          <h4>G\u00f6nderiler:<\/h4>\n          <ul>\n            {profile()?.posts.map(post => (\n              <li key={post.id}>{post.title}<\/li>\n            ))}\n          <\/ul>\n        <\/div>\n      )}\n    <\/div>\n  );\n}\n\nexport default ProfileComponent;\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>fetchUserProfile<\/code> fonksiyonu iki ard\u0131\u015f\u0131k <code>fetch<\/code> iste\u011fi yapar ve her ikisine de ayn\u0131 <code>signal<\/code> nesnesini ge\u00e7irir. E\u011fer <code>profileFetchPromise.cancel()<\/code> \u00e7a\u011fr\u0131l\u0131rsa, her iki istek de iptal edilecek ve kaynak israf\u0131 \u00f6nlenecektir. Bu, karma\u015f\u0131k veri ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir model sunar.<\/p>\n<h3>K\u00fcresel Hata \u0130\u015fleme ve Hata S\u0131n\u0131flar\u0131<\/h3>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, hatalar\u0131 merkezi bir yerde ele almak ve belirli hata tiplerine g\u00f6re farkl\u0131 tepkiler vermek isteyebilirsiniz. \u00d6zel hata s\u0131n\u0131flar\u0131 olu\u015fturmak, bu konuda size yard\u0131mc\u0131 olabilir.<\/p>\n<pre><code>\n\/\/ custom-errors.ts\ninterface ErrorDetails {\n    message: string;\n    code: string;\n    timestamp: string;\n    details?: any; \/\/ Ek detaylar i\u00e7in\n}\n\n\/\/ Temel custom hata s\u0131n\u0131f\u0131m\u0131z\nexport class CustomAppError extends Error {\n    public details: ErrorDetails;\n\n    constructor(details: ErrorDetails, message?: string) {\n        super(message || details.message);\n        this.name = 'CustomAppError';\n        this.details = details;\n        \/\/ TypeScript'te prototype chain'i do\u011fru ayarlamak i\u00e7in\n        Object.setPrototypeOf(this, CustomAppError.prototype);\n    }\n}\n\n\/\/ \u00d6zel bir do\u011frulama hatas\u0131 s\u0131n\u0131f\u0131\nexport class CustomValidationError extends CustomAppError {\n    public validationErrors: { [field: string]: string[] };\n\n    constructor(details: ErrorDetails & { errors: { [field: string]: string[] } }) {\n        super(details, 'Do\u011frulama hatas\u0131 olu\u015ftu.');\n        this.name = 'CustomValidationError';\n        this.validationErrors = details.errors;\n        Object.setPrototypeOf(this, CustomValidationError.prototype);\n    }\n}\n\n\/\/ \u00d6zel bir yetkilendirme hatas\u0131 s\u0131n\u0131f\u0131\nexport class CustomUnauthorizedError extends CustomAppError {\n    constructor(details: ErrorDetails) {\n        super(details, 'Yetkisiz eri\u015fim.');\n        this.name = 'CustomUnauthorizedError';\n        Object.setPrototypeOf(this, CustomUnauthorizedError.prototype);\n    }\n}\n\n\/\/ API yan\u0131t\u0131n\u0131 CustomAppError'a d\u00f6n\u00fc\u015ft\u00fcren bir yard\u0131mc\u0131 fonksiyon\nexport async function handleApiResponse<T>(response: Response): Promise<T> {\n    if (!response.ok) {\n        const errorData = await response.json();\n        const commonErrorDetails: ErrorDetails = {\n            message: errorData.message || 'Bilinmeyen sunucu hatas\u0131.',\n            code: errorData.code || 'HTTP_ERROR',\n            timestamp: new Date().toISOString(),\n            details: errorData \/\/ T\u00fcm yan\u0131t\u0131 detaylara ekle\n        };\n\n        switch (response.status) {\n            case 400: \/\/ Bad Request - Genellikle do\u011frulama hatalar\u0131\n                if (errorData.code === 'VALIDATION_FAILED' && errorData.errors) {\n                    throw new CustomValidationError({ ...commonErrorDetails, errors: errorData.errors });\n                }\n                throw new CustomAppError(commonErrorDetails);\n            case 401: \/\/ Unauthorized\n                throw new CustomUnauthorizedError(commonErrorDetails);\n            case 404: \/\/ Not Found\n                throw new CustomAppError({ ...commonErrorDetails, code: 'NOT_FOUND', message: '\u0130stenen kaynak bulunamad\u0131.' });\n            default:\n                throw new CustomAppError(commonErrorDetails);\n        }\n    }\n    return response.json() as Promise<T>;\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131 sayesinde, API servis fonksiyonlar\u0131n\u0131zda <code>handleApiResponse<\/code> fonksiyonunu kullanarak otomatik olarak tipli hata s\u0131n\u0131flar\u0131n\u0131 f\u0131rlatabilir ve UI bile\u015fenlerinizde bu \u00f6zel hata s\u0131n\u0131flar\u0131n\u0131 <code>instanceof<\/code> ile kontrol edebilirsiniz. Bu, hata i\u015fleme mant\u0131\u011f\u0131n\u0131z\u0131 \u00e7ok daha temiz ve merkezi hale getirir.<\/p>\n<pre><code>\n\/\/ updatedDataService.ts (\u00f6nceki createUser fonksiyonu yerine)\nimport { LazyPromise } from 'lazy-promise';\nimport { CustomAppError, handleApiResponse } from '.\/custom-errors';\n\ninterface User { \/* ... *\/ }\n\nexport function createNewUser(userData: { name: string; email: string }, signal: AbortSignal): LazyPromise<User, CustomAppError> {\n  return new LazyPromise(async (resolve, reject) => {\n    try {\n      const response = await fetch('\/api\/users', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify(userData),\n        signal,\n      });\n      const newUser = await handleApiResponse<User>(response); \/\/ Hata i\u015fleme burada yap\u0131l\u0131r\n      resolve(newUser);\n    } catch (err) {\n      if (err instanceof CustomAppError) {\n        reject(err); \/\/ \u00d6zel hata s\u0131n\u0131f\u0131n\u0131 reject et\n      } else if (err.name === 'AbortError') {\n        console.log(\"Kullan\u0131c\u0131 olu\u015fturma iste\u011fi iptal edildi.\");\n        return;\n      } else {\n        \/\/ Beklenmeyen di\u011fer hatalar\n        reject(new CustomAppError({ message: err.message || 'Bilinmeyen bir hata olu\u015ftu.', code: 'CLIENT_ERROR', timestamp: new Date().toISOString(), details: err }));\n      }\n    }\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Ve UI'da:<\/p>\n<pre><code>\n\/\/ updatedUserRegistrationForm.tsx\nimport { createSignal } from 'solid-js';\nimport { createNewUser } from '.\/updatedDataService';\nimport { CustomAppError, CustomValidationError, CustomUnauthorizedError } from '.\/custom-errors';\n\nfunction UpdatedUserRegistrationForm() {\n  \/\/ ... (Sinyaller ve di\u011fer state'ler \u00f6nceki \u00f6rnekteki gibi)\n  const [globalError, setGlobalError] = createSignal<CustomAppError | null>(null);\n\n  const handleSubmit = async (e: Event) => {\n    \/\/ ... (iptal mekanizmas\u0131 ve loading state'leri \u00f6nceki \u00f6rnekteki gibi)\n\n    try {\n      const user = await currentCreateUserPromise.then(res => res); \/\/ LazyPromise'i await ile kullanmak\n      setSuccessMessage(<code>Kullan\u0131c\u0131 ${user.name} ba\u015far\u0131yla olu\u015fturuldu!<\/code>);\n      \/\/ ...\n    } catch (error) {\n      if (error instanceof CustomValidationError) {\n        setFieldErrors(error.validationErrors);\n        setGlobalError(error);\n      } else if (error instanceof CustomUnauthorizedError) {\n        setGlobalError(error);\n        \/\/ navigate('\/login');\n      } else if (error instanceof CustomAppError) {\n        setGlobalError(error);\n      } else {\n        \/\/ LazyPromise'in AbortError'u veya di\u011fer beklenmeyen JS hatalar\u0131\n        setGlobalError(new CustomAppError({ message: error.message || 'Beklenmedik bir istemci hatas\u0131 olu\u015ftu.', code: 'UNEXPECTED_CLIENT_ERROR', timestamp: new Date().toISOString() }));\n      }\n      setLoading(false);\n      currentCreateUserPromise = null;\n    }\n  };\n  \/\/ ... (render metodu \u00f6nceki \u00f6rnekteki gibi, sadece hata g\u00f6sterimi farkl\u0131)\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131mlar, uygulaman\u0131z\u0131n daha b\u00fcy\u00fck ve karma\u015f\u0131k hale geldi\u011finde bile y\u00f6netilebilir, hata toleransl\u0131 ve kullan\u0131c\u0131 dostu kalmas\u0131n\u0131 sa\u011flar. LazyPromise'in iptal mekanizmas\u0131 ve TypeScript'in tipli hata s\u0131n\u0131flar\u0131yla, modern SolidJS uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc bir temel olu\u015fturmu\u015f olursunuz.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular: \u0130ptal Edilebilirlik ve Tipli Hata Y\u00f6netimi Gelece\u011fi Nas\u0131ld\u0131r?<\/h2>\n<p>Bu makale boyunca, SolidJS uygulamalar\u0131nda iptal edilebilir asenkron g\u00f6revlerin ve tipli sunucu hatalar\u0131n\u0131n \u00f6nemini, LazyPromise k\u00fct\u00fcphanesini kullanarak bu kavramlar\u0131 nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda sa\u011flad\u0131klar\u0131 faydalar\u0131 detayl\u0131 bir \u015fekilde inceledik. Modern web geli\u015ftirme, kullan\u0131c\u0131 deneyimini merkeze alan ve kaynaklar\u0131 verimli kullanan yakla\u015f\u0131mlar\u0131 benimsemeyi gerektirir. LazyPromise gibi ara\u00e7lar, JavaScript'in temel Promise yap\u0131s\u0131na iptal edilebilirli\u011fi ekleyerek bu vizyonu ger\u00e7e\u011fe d\u00f6n\u00fc\u015ft\u00fcrmemize yard\u0131mc\u0131 olur. Ayn\u0131 \u015fekilde, TypeScript ile sunucu hatalar\u0131n\u0131 tipli bir \u015fekilde modellemek, uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r, geli\u015ftirici deneyimini iyile\u015ftirir ve kullan\u0131c\u0131lara daha anlaml\u0131 geri bildirimler sunar.<\/p>\n<p>\u0130ptal edilebilir asenkron g\u00f6revler, \u00f6zellikle arama, filtreleme, dosya y\u00fckleme ve sayfalar aras\u0131 h\u0131zl\u0131 ge\u00e7i\u015f gibi dinamik kullan\u0131c\u0131 etkile\u015fimlerinin oldu\u011fu alanlarda uygulaman\u0131z\u0131n duyarl\u0131l\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Gereksiz a\u011f isteklerini kesmek, sunucu y\u00fck\u00fcn\u00fc azaltmak ve istemci taraf\u0131nda yar\u0131\u015f ko\u015fular\u0131n\u0131n \u00f6n\u00fcne ge\u00e7mek, bu yakla\u015f\u0131m\u0131n temel faydalar\u0131 aras\u0131ndad\u0131r. LazyPromise, standart <code>AbortController<\/code> API'si ile entegre olarak bu yetene\u011fi sa\u011flam bir \u015fekilde sunar.<\/p>\n<p>Tipli sunucu hatalar\u0131 ise, hata y\u00f6netimini bir <code>try...catch<\/code> blo\u011funun \u00f6tesine ta\u015f\u0131yarak, hata nesnesinin yap\u0131s\u0131n\u0131 ve anlam\u0131n\u0131 derleme zaman\u0131nda bilebilmemizi sa\u011flar. Bu sayede, farkl\u0131 hata t\u00fcrlerine (do\u011frulama hatalar\u0131, yetkilendirme hatalar\u0131 vb.) \u00f6zel olarak tepki verebilir, kullan\u0131c\u0131ya spesifik ve eyleme ge\u00e7irilebilir mesajlar sunabiliriz. TypeScript'in tip g\u00fcvenli\u011fi ve \u00f6zel hata s\u0131n\u0131flar\u0131 olu\u015fturma yetene\u011fi, bu s\u00fcrecin g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Bu iki yakla\u015f\u0131m bir araya geldi\u011finde, SolidJS ile geli\u015ftirilen uygulamalar\u0131n hem performans hem de hata tolerans\u0131 a\u00e7\u0131s\u0131ndan \u00e7ok daha \u00fcst\u00fcn olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Gelecekte, web platformunun ve JavaScript ekosisteminin geli\u015fimiyle birlikte, asenkron ak\u0131\u015flar\u0131n y\u00f6netimi ve hata i\u015fleme mekanizmalar\u0131 daha da olgunla\u015facakt\u0131r. Web Workers ile istemci taraf\u0131nda daha yo\u011fun hesaplamalar\u0131n iptal edilebilir bir \u015fekilde y\u00f6netilmesi veya daha geli\u015fmi\u015f sunucu-istemci hata anla\u015fmalar\u0131 gibi yenilikler g\u00f6rmemiz muhtemeldir. Ancak LazyPromise ve tipli hata y\u00f6netimi gibi mevcut ara\u00e7lar, bu gelece\u011fe haz\u0131rlanmak i\u00e7in sa\u011flam bir temel sunmaktad\u0131r. Bu makalenin, SolidJS projelerinizde daha performansl\u0131, kararl\u0131 ve kullan\u0131c\u0131 dostu uygulamalar geli\u015ftirmeniz i\u00e7in size ilham verdi\u011fini umuyoruz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n<h4>LazyPromise ve standart JavaScript Promise aras\u0131ndaki temel fark nedir?<\/h4>\n<p>Temel fark, LazyPromise'in \"tembel\" olmas\u0131 ve iptal edilebilir olmas\u0131d\u0131r. Standart bir Promise, olu\u015fturuldu\u011fu anda asenkron i\u015flemi ba\u015flat\u0131r ve d\u0131\u015far\u0131dan iptal edilemez. LazyPromise ise, <code>.then()<\/code> veya <code>.catch()<\/code> \u00e7a\u011fr\u0131lana kadar i\u015flemi ba\u015flatmaz ve <code>.cancel()<\/code> metodu arac\u0131l\u0131\u011f\u0131yla aktif bir i\u015flemi durdurabilir.<\/p>\n<\/li>\n<li>\n<h4>Neden <code>AbortController<\/code> do\u011frudan kullanmak yerine LazyPromise kullanmal\u0131y\u0131m?<\/h4>\n<p><code>AbortController<\/code>, iptal mekanizmas\u0131n\u0131n temelini sa\u011flar ancak her asenkron i\u015flem i\u00e7in manuel olarak bir kontrol\u00f6r olu\u015fturmak, sinyali iletmek ve hatalar\u0131 yakalamak geli\u015ftiriciye ek y\u00fck bindirir. LazyPromise, <code>AbortController<\/code>'\u0131 kendi i\u00e7inde kaps\u00fclleyerek bu s\u00fcreci otomatikle\u015ftirir ve Promise tabanl\u0131 bir aray\u00fczle daha temiz bir iptal mekanizmas\u0131 sunar. \u00d6zellikle SolidJS'in reaktif ba\u011flam\u0131nda, Promise ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha kolay y\u00f6netmenizi sa\u011flar.<\/p>\n<\/li>\n<li>\n<h4>Tipli sunucu hatalar\u0131 kullanmak performans\u0131 etkiler mi?<\/h4>\n<p>Hay\u0131r, tipli sunucu hatalar\u0131 kullanmak uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131 performans\u0131n\u0131 olumsuz etkilemez. TypeScript, derleme zaman\u0131nda tip kontrolleri yapar ve derlenmi\u015f JavaScript kodunda ek bir \u00e7al\u0131\u015fma zaman\u0131 y\u00fck\u00fc olu\u015fturmaz. Aksine, tipli hatalar hata ay\u0131klama s\u00fcresini k\u0131saltarak geli\u015ftirme verimlili\u011fini art\u0131r\u0131r ve \u00e7al\u0131\u015fma zaman\u0131nda olu\u015fabilecek beklenmedik hata durumlar\u0131n\u0131 (\u00f6rne\u011fin, yanl\u0131\u015f \u00f6zellik eri\u015fimi) \u00f6nleyerek uygulaman\u0131n daha kararl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n<h4>SolidJS'in <code>createResource<\/code> kancas\u0131 ile LazyPromise'i nas\u0131l entegre edebilirim?<\/h4>\n<p><code>createResource<\/code>, bir fetcher fonksiyonu bekler. Bu fetcher fonksiyonu bir Promise d\u00f6nd\u00fcrmelidir. LazyPromise de bir Promise d\u00f6nd\u00fcrd\u00fc\u011f\u00fc i\u00e7in do\u011frudan kullan\u0131labilir. Ancak <code>createResource<\/code>, dahili olarak kendi bir iptal mekanizmas\u0131 sunmad\u0131\u011f\u0131ndan, LazyPromise'in iptal yetene\u011fini kullanmak i\u00e7in <code>createResource<\/code>'un kayna\u011f\u0131n\u0131 tetikleyen sinyal de\u011fi\u015fti\u011finde veya bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda LazyPromise'i manuel olarak iptal etmeniz gerekebilir. Bu, genellikle <code>createEffect<\/code> ve <code>onCleanup<\/code> ile y\u00f6netilir, yukar\u0131daki arama kutusu \u00f6rne\u011finde oldu\u011fu gibi.<\/p>\n<\/li>\n<li>\n<h4>T\u00fcm API isteklerimi LazyPromise ile mi sarmal\u0131y\u0131m?<\/h4>\n<p>T\u00fcm API isteklerini LazyPromise ile sarmak zorunda de\u011filsiniz. Ancak, kullan\u0131c\u0131n\u0131n h\u0131zl\u0131 etkile\u015fimde bulunabilece\u011fi (arama, filtreleme, dosya y\u00fckleme gibi) veya uzun s\u00fcrebilecek ve bile\u015fen \u00f6mr\u00fcyle ili\u015fkili olan (sayfadan ayr\u0131l\u0131nca iptal edilmesi gereken) t\u00fcm asenkron i\u015flemler i\u00e7in LazyPromise kullanmak, uygulama duyarl\u0131l\u0131\u011f\u0131n\u0131 ve kaynak verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. \u0130ptal edilebilirli\u011fin bir fayda sa\u011flamad\u0131\u011f\u0131 basit, tek seferlik istekler i\u00e7in standart Promise'leri kullanmaya devam edebilirsiniz.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele&hellip;","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-35816","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>SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131<\/title>\n<meta name=\"description\" content=\"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\" \/>\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\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131\" \/>\n<meta property=\"og:description\" content=\"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-04T02:32:40+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=\"42 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131\",\"datePublished\":\"2025-12-04T02:32:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\"},\"wordCount\":5618,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\",\"name\":\"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-04T02:32:40+00:00\",\"description\":\"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131\"}]},{\"@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":"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131","description":"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","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\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/","og_locale":"tr_TR","og_type":"article","og_title":"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131","og_description":"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","og_url":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-04T02:32:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"42 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131","datePublished":"2025-12-04T02:32:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/"},"wordCount":5618,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/","url":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/","name":"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-04T02:32:40+00:00","description":"SolidJS uygulamalar\u0131n\u0131zda asenkron g\u00f6revleri y\u00f6netmek, iptal edilebilir API \u00e7a\u011fr\u0131lar\u0131 yapmak ve sunucu hatalar\u0131n\u0131 g\u00fcvenle tipli bir \u015fekilde ele almak i\u00e7in LazyPromise kullan\u0131m\u0131n\u0131 ke\u015ffedin. Kullan\u0131c\u0131 deneyimini art\u0131ran bu modern yakla\u015f\u0131mlar\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-ve-lazypromise-ile-iptal-edilebilir-asenkron-gorevler-ve-tipli-sunucu-hatalari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SolidJS ve LazyPromise ile \u0130ptal Edilebilir Asenkron G\u00f6revler ve Tipli Sunucu Hatalar\u0131"}]},{"@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\/35816","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=35816"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35816\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35816"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35816"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35816"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}