{"id":35249,"date":"2025-11-27T11:40:57","date_gmt":"2025-11-27T08:40:57","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35249"},"modified":"2025-11-27T11:40:57","modified_gmt":"2025-11-27T08:40:57","slug":"javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/","title":{"rendered":"JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131<\/h2>\n<p>JavaScript, web taray\u0131c\u0131lar\u0131nda etkile\u015fimli kullan\u0131c\u0131 deneyimleri sa\u011flamaktan, sunucu taraf\u0131nda (Node.js ile) karma\u015f\u0131k uygulamalar geli\u015ftirmeye kadar geni\u015f bir yelpazede kullan\u0131lan g\u00fc\u00e7l\u00fc bir programlama dilidir. Ancak JavaScript&#8217;in do\u011fas\u0131 gere\u011fi tek i\u015f par\u00e7ac\u0131kl\u0131 (single-threaded) olmas\u0131, uzun s\u00fcren veya gecikme potansiyeli olan i\u015flemlerin (\u00f6rne\u011fin, a\u011f istekleri, dosya okuma\/yazma) uygulaman\u0131n donmas\u0131na yol a\u00e7abilece\u011fi anlam\u0131na gelir. \u0130\u015fte bu noktada asenkron programlama devreye girer ve JavaScript Promise&#8217;lar\u0131, bu asenkron i\u015flemlerin y\u00f6netilmesinde modern ve g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Bu makalede, JavaScript Promise&#8217;lar\u0131n\u0131n ne oldu\u011funu, neden bu kadar \u00f6nemli olduklar\u0131n\u0131, nas\u0131l \u00e7al\u0131\u015ft\u0131klar\u0131n\u0131 ve asenkron kodunuzu daha okunabilir, y\u00f6netilebilir ve hataya dayan\u0131kl\u0131 hale getirmek i\u00e7in nas\u0131l kullanabilece\u011finizi derinlemesine inceleyece\u011fiz. Callback&#8217;lerin s\u0131n\u0131rl\u0131l\u0131klar\u0131ndan ba\u015flayarak, Promise&#8217;lar\u0131n temel kavramlar\u0131na, zincirleme yeteneklerine, geli\u015fmi\u015f API&#8217;lerine ve son olarak <code>async\/await<\/code> ile nas\u0131l daha da basitle\u015ftirildiklerine de\u011finece\u011fiz.<\/p>\n<h3>Asenkron JavaScript&#8217;e Giri\u015f<\/h3>\n<p>JavaScript&#8217;in tek i\u015f par\u00e7ac\u0131kl\u0131 yap\u0131s\u0131, ayn\u0131 anda yaln\u0131zca bir g\u00f6revin y\u00fcr\u00fct\u00fclebilece\u011fi anlam\u0131na gelir. Taray\u0131c\u0131 ortam\u0131nda, bu i\u015f par\u00e7ac\u0131\u011f\u0131 ayn\u0131 zamanda kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) de i\u015fler. E\u011fer uzun s\u00fcren bir i\u015flem bu ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke ederse, kullan\u0131c\u0131 aray\u00fcz\u00fc donar ve yan\u0131t vermez hale gelir. Bu durum, k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7ar.<\/p>\n<p>Asenkron programlama, bu t\u00fcr bloklama i\u015flemlerini ana i\u015f par\u00e7ac\u0131\u011f\u0131ndan ay\u0131rarak, di\u011fer g\u00f6revlerin (\u00f6rne\u011fin UI g\u00fcncellemeleri) e\u015f zamanl\u0131 olarak y\u00fcr\u00fct\u00fclmesine olanak tan\u0131r. JavaScript&#8217;in bunu ba\u015farmak i\u00e7in kulland\u0131\u011f\u0131 temel mekanizma, &#8220;Olay D\u00f6ng\u00fcs\u00fc&#8221; (Event Loop) ad\u0131 verilen bir sistemdir. Olay d\u00f6ng\u00fcs\u00fc, ana i\u015f par\u00e7ac\u0131\u011f\u0131 bo\u015f oldu\u011funda bekleyen asenkron g\u00f6revleri s\u0131raya al\u0131r ve y\u00fcr\u00fct\u00fcr.<\/p>\n<h4>Geleneksel Asenkron Yakla\u015f\u0131mlar: Callback&#8217;ler<\/h4>\n<p>Promise&#8217;lardan \u00f6nce, asenkron i\u015flemleri y\u00f6netmenin birincil yolu callback fonksiyonlar\u0131yd\u0131. Bir callback, asenkron bir i\u015flemin tamamlanmas\u0131n\u0131n ard\u0131ndan \u00e7a\u011fr\u0131lan bir fonksiyondur.<\/p>\n<pre><code class=\"language-javascript\">function veriGetir(url, callback) {\n  fetch(url)\n    .then(response => response.json())\n    .then(data => callback(null, data))\n    .catch(error => callback(error, null));\n}\n\nveriGetir('https:\/\/api.example.com\/data', (hata, veri) => {\n  if (hata) {\n    console.error('Veri getirilirken hata olu\u015ftu:', hata);\n  } else {\n    console.log('Veri ba\u015far\u0131yla getirildi:', veri);\n  }\n});<\/code><\/pre>\n<p>Callback&#8217;ler basit asenkron senaryolar i\u00e7in yeterli olsa da, karma\u015f\u0131k veya birbirine ba\u011f\u0131ml\u0131 asenkron i\u015flemler zinciri olu\u015fturuldu\u011funda ciddi sorunlara yol a\u00e7abilirler:<\/p>\n<p>*   <strong>Callback Hell (Piramit Felaketi):<\/strong> Birden fazla i\u00e7 i\u00e7e callback, kodun okunmas\u0131n\u0131 ve bak\u0131m\u0131n\u0131 son derece zorla\u015ft\u0131r\u0131r. Her yeni asenkron ad\u0131m, bir \u00f6nceki callback&#8217;in i\u00e7ine girer ve kod sa\u011fa do\u011fru uzayan bir &#8220;piramit&#8221; \u015feklini al\u0131r.<br \/>\n*   <strong>Hata Y\u00f6netimi Zorlu\u011fu:<\/strong> \u0130\u00e7 i\u00e7e ge\u00e7mi\u015f callback&#8217;lerde hatalar\u0131 do\u011fru bir \u015fekilde yakalamak ve yaymak karma\u015f\u0131k hale gelir. Her seviyede hata kontrol\u00fc yapmak gerekir.<br \/>\n*   <strong>Ak\u0131\u015f Kontrol\u00fc Karma\u015f\u0131kl\u0131\u011f\u0131:<\/strong> Birden fazla asenkron i\u015flemin paralel olarak \u00e7al\u0131\u015fmas\u0131, belirli bir s\u0131rayla tamamlanmas\u0131 veya yaln\u0131zca birinin sonucunun beklenmesi gibi senaryolar\u0131 y\u00f6netmek callback&#8217;lerle olduk\u00e7a zordur.<\/p>\n<p>Bu s\u0131n\u0131rl\u0131l\u0131klar, asenkron programlamay\u0131 daha d\u00fczenli ve anla\u015f\u0131l\u0131r hale getirecek yeni bir soyutlamaya olan ihtiyac\u0131 do\u011furdu: Promise&#8217;lar.<\/p>\n<h3>Promise Nedir?<\/h3>\n<p>Bir Promise (T\u00fcrk\u00e7e&#8217;de &#8220;s\u00f6z&#8221; veya &#8220;vaat&#8221; anlam\u0131na gelir), asenkron bir i\u015flemin nihai sonucunu (ba\u015far\u0131l\u0131 tamamlanma de\u011feri veya ba\u015far\u0131s\u0131zl\u0131k nedeni) temsil eden bir JavaScript nesnesidir. Basit\u00e7e s\u00f6ylemek gerekirse, bir Promise, &#8220;\u015eu anda tamamlanmam\u0131\u015f bir i\u015flem i\u00e7in size gelecekte bir de\u011fer s\u00f6z\u00fc veriyorum. Bu de\u011fer ya ba\u015far\u0131yla d\u00f6necek ya da bir hatayla sonu\u00e7lanacak.&#8221; der.<\/p>\n<p>Promise&#8217;lar, asenkron i\u015flemleri callback&#8217;ler yerine daha d\u00fczenli ve zincirlenebilir bir \u015fekilde y\u00f6netmek i\u00e7in bir yap\u0131 sa\u011flar.<\/p>\n<h4>Promise Durumlar\u0131 (States)<\/h4>\n<p>Bir Promise, ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca \u00fc\u00e7 farkl\u0131 durumda bulunabilir:<\/p>\n<p>1.  <strong><code>pending<\/code> (Beklemede):<\/strong> Promise&#8217;\u0131n ba\u015flang\u0131\u00e7 durumudur. Asenkron i\u015flem hen\u00fcz tamamlanmam\u0131\u015f veya reddedilmemi\u015ftir.<br \/>\n2.  <strong><code>fulfilled<\/code> (Yerine Getirildi \/ Ba\u015far\u0131l\u0131):<\/strong> Asenkron i\u015flem ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda Promise bu duruma ge\u00e7er. Bu durumda, Promise&#8217;\u0131n bir &#8220;de\u011feri&#8221; (value) vard\u0131r.<br \/>\n3.  <strong><code>rejected<\/code> (Reddedildi \/ Ba\u015far\u0131s\u0131z):<\/strong> Asenkron i\u015flem bir hata nedeniyle ba\u015far\u0131s\u0131z oldu\u011funda Promise bu duruma ge\u00e7er. Bu durumda, Promise&#8217;\u0131n bir &#8220;nedeni&#8221; (reason) veya hata objesi vard\u0131r.<\/p>\n<p>\u00d6nemli bir \u00f6zellik, bir Promise&#8217;\u0131n <code>pending<\/code> durumundan <code>fulfilled<\/code> veya <code>rejected<\/code> durumuna yaln\u0131zca bir kez ge\u00e7ebilmesidir. Bir kez yerine getirildi\u011finde veya reddedildi\u011finde, Promise&#8217;\u0131n durumu ve de\u011feri (veya nedeni) asla de\u011fi\u015fmez. Bu, Promise&#8217;lar\u0131n &#8220;de\u011fi\u015fmez&#8221; (immutable) oldu\u011fu anlam\u0131na gelir.<\/p>\n<h3>Bir Promise Olu\u015fturma<\/h3>\n<p>Yeni bir Promise olu\u015fturmak i\u00e7in <code>new Promise()<\/code> yap\u0131c\u0131s\u0131n\u0131 kullan\u0131r\u0131z. Bu yap\u0131c\u0131, iki arg\u00fcman alan bir y\u00fcr\u00fct\u00fcc\u00fc fonksiyonu (executor function) al\u0131r: <code>resolve<\/code> ve <code>reject<\/code>.<\/p>\n<pre><code class=\"language-javascript\">const benimIlkPromise = new Promise((resolve, reject) => {\n  \/\/ Asenkron bir i\u015flem sim\u00fcle edelim (\u00f6rne\u011fin, bir sunucu iste\u011fi)\n  const basariDurumu = Math.random() > 0.5; \/\/ %50 ihtimalle ba\u015far\u0131l\u0131\n\n  setTimeout(() => {\n    if (basariDurumu) {\n      resolve('\u0130\u015flem ba\u015far\u0131yla tamamland\u0131!'); \/\/ Promise'\u0131 ba\u015far\u0131l\u0131 olarak i\u015faretle\n    } else {\n      reject('\u0130\u015flem s\u0131ras\u0131nda bir hata olu\u015ftu.'); \/\/ Promise'\u0131 ba\u015far\u0131s\u0131z olarak i\u015faretle\n    }\n  }, 2000); \/\/ 2 saniye sonra sonu\u00e7lanacak\n});\n\nconsole.log('Promise olu\u015fturuldu, beklemede...');\n\n\/\/ Promise'\u0131n sonucunu dinlemek i\u00e7in .then() ve .catch() kullan\u0131r\u0131z\nbenimIlkPromise\n  .then((mesaj) => {\n    console.log('Ba\u015far\u0131l\u0131:', mesaj); \/\/ Promise ba\u015far\u0131l\u0131 oldu\u011funda \u00e7al\u0131\u015f\u0131r\n  })\n  .catch((hata) => {\n    console.error('Hata:', hata); \/\/ Promise ba\u015far\u0131s\u0131z oldu\u011funda \u00e7al\u0131\u015f\u0131r\n  });\n\nconsole.log('Promise dinleyicileri eklendi.');<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>new Promise((resolve, reject) => { ... })<\/code>: Yeni bir Promise olu\u015ftururuz. \u0130\u00e7indeki fonksiyon hemen \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <code>resolve(de\u011fer)<\/code>: Asenkron i\u015flem ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Promise&#8217;\u0131n durumunu <code>fulfilled<\/code> olarak de\u011fi\u015ftirir ve belirtilen <code>de\u011fer<\/code> ile sonu\u00e7land\u0131r\u0131r.<br \/>\n*   <code>reject(neden)<\/code>: Asenkron i\u015flem bir hata nedeniyle ba\u015far\u0131s\u0131z oldu\u011funda \u00e7a\u011fr\u0131l\u0131r. Promise&#8217;\u0131n durumunu <code>rejected<\/code> olarak de\u011fi\u015ftirir ve belirtilen <code>neden<\/code> (genellikle bir <code>Error<\/code> objesi) ile sonu\u00e7land\u0131r\u0131r.<\/p>\n<h3>Promise Zincirleme (Chaining)<\/h3>\n<p>Promise&#8217;lar\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, <code>.then()<\/code>, <code>.catch()<\/code> ve <code>.finally()<\/code> metodlar\u0131 arac\u0131l\u0131\u011f\u0131yla zincirlenebilmeleridir. Her <code>.then()<\/code> \u00e7a\u011fr\u0131s\u0131, yeni bir Promise d\u00f6nd\u00fcr\u00fcr ve bu da ard\u0131\u015f\u0131k asenkron i\u015flemleri d\u00fcz bir ak\u0131\u015fta yazmam\u0131z\u0131 sa\u011flar. Bu, &#8220;Callback Hell&#8221; sorununu ortadan kald\u0131r\u0131r.<\/p>\n<h4><code>.then()<\/code> Metodu<\/h4>\n<p><code>.then()<\/code> metodu, bir Promise ba\u015far\u0131yla yerine getirildi\u011finde (fulfilled) \u00e7a\u011fr\u0131lacak bir callback fonksiyonu kaydetmek i\u00e7in kullan\u0131l\u0131r. \u0130ki opsiyonel arg\u00fcman alabilir:<\/p>\n<p>1.  <code>onFulfilled<\/code>: Promise ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda \u00e7a\u011fr\u0131lacak fonksiyon. Promise&#8217;\u0131n ba\u015far\u0131 de\u011ferini arg\u00fcman olarak al\u0131r.<br \/>\n2.  <code>onRejected<\/code>: Promise reddedildi\u011finde \u00e7a\u011fr\u0131lacak fonksiyon. Promise&#8217;\u0131n hata nedenini arg\u00fcman olarak al\u0131r. (Genellikle hata yakalamak i\u00e7in <code>.catch()<\/code> tercih edilir.)<\/p>\n<pre><code class=\"language-javascript\">function adim1() {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      console.log('Ad\u0131m 1 tamamland\u0131.');\n      resolve(10); \/\/ Sonucu bir sonraki ad\u0131ma aktar\n    }, 1000);\n  });\n}\n\nfunction adim2(oncekiSonuc) {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      console.log(<code>Ad\u0131m 2 tamamland\u0131, \u00f6nceki sonu\u00e7: ${oncekiSonuc}<\/code>);\n      resolve(oncekiSonuc * 2);\n    }, 1000);\n  });\n}\n\nfunction adim3(oncekiSonuc) {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      console.log(<code>Ad\u0131m 3 tamamland\u0131, \u00f6nceki sonu\u00e7: ${oncekiSonuc}<\/code>);\n      resolve(oncekiSonuc + 5);\n    }, 1000);\n  });\n}\n\nadim1()\n  .then(sonuc1 => adim2(sonuc1)) \/\/ adim1'in sonucunu adim2'ye aktar\n  .then(sonuc2 => adim3(sonuc2)) \/\/ adim2'nin sonucunu adim3'e aktar\n  .then(nihaiSonuc => {\n    console.log('T\u00fcm ad\u0131mlar tamamland\u0131, nihai sonu\u00e7:', nihaiSonuc);\n  })\n  .catch(hata => {\n    console.error('Zincirde bir hata olu\u015ftu:', hata);\n  });<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>adim1<\/code>, <code>adim2<\/code> ve <code>adim3<\/code> fonksiyonlar\u0131 s\u0131rayla \u00e7al\u0131\u015f\u0131r. Her <code>.then()<\/code> \u00e7a\u011fr\u0131s\u0131, kendisinden \u00f6nceki Promise&#8217;\u0131n sonucunu al\u0131r ve yeni bir Promise d\u00f6nd\u00fcrerek zincirlemenin devam etmesini sa\u011flar. E\u011fer bir <code>.then()<\/code> callback&#8217;i bir de\u011fer d\u00f6nd\u00fcr\u00fcrse, bu de\u011fer bir sonraki <code>.then()<\/code> callback&#8217;ine ge\u00e7irilir. E\u011fer bir Promise d\u00f6nd\u00fcr\u00fcrse, bir sonraki <code>.then()<\/code> bu Promise&#8217;\u0131n \u00e7\u00f6z\u00fclmesini bekler.<\/p>\n<h4><code>.catch()<\/code> Metodu<\/h4>\n<p><code>.catch()<\/code> metodu, bir Promise reddedildi\u011finde (rejected) \u00e7a\u011fr\u0131lacak bir callback fonksiyonu kaydetmek i\u00e7in kullan\u0131l\u0131r. Temel olarak <code>promise.then(null, onRejected)<\/code> ile ayn\u0131d\u0131r, ancak daha okunabilir bir hata yakalama mekanizmas\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">function basarisizIslem() {\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      reject(new Error('Bu i\u015flem kas\u0131tl\u0131 olarak ba\u015far\u0131s\u0131z oldu!'));\n    }, 1000);\n  });\n}\n\nbasarisizIslem()\n  .then(sonuc => {\n    console.log('Ba\u015far\u0131l\u0131:', sonuc); \/\/ Bu asla \u00e7al\u0131\u015fmaz\n  })\n  .catch(hata => {\n    console.error('Hata yakaland\u0131:', hata.message); \/\/ Hata burada yakalan\u0131r\n  });\n\n\/\/ Zincirleme sonunda .catch() kullanmak en yayg\u0131n ve \u00f6nerilen y\u00f6ntemdir.\n\/\/ Bu, zincirdeki herhangi bir Promise'dan gelen hatay\u0131 yakalar.\nnew Promise((resolve, reject) => {\n    setTimeout(() => reject('\u0130lk hata'), 500);\n  })\n  .then(() => new Promise((resolve, reject) => setTimeout(() => resolve('\u0130kinci ad\u0131m'), 500)))\n  .then(() => console.log('Ba\u015far\u0131l\u0131'))\n  .catch(hata => console.error('T\u00fcm zincir i\u00e7in hata:', hata));<\/code><\/pre>\n<p>Bir Promise zincirinde, bir Promise reddedildi\u011finde, kontrol zincirdeki bir sonraki <code>.catch()<\/code> handler&#8217;\u0131na atlar. E\u011fer zincirde hi\u00e7 <code>.catch()<\/code> yoksa, hata &#8220;yakalanmayan Promise reddi&#8221; (unhandled promise rejection) olarak yay\u0131l\u0131r ve genellikle konsolda bir uyar\u0131 veya hata ile sonu\u00e7lan\u0131r.<\/p>\n<h4><code>.finally()<\/code> Metodu (ES2018)<\/h4>\n<p><code>.finally()<\/code> metodu, Promise&#8217;\u0131n nihai durumundan (fulfilled veya rejected) ba\u011f\u0131ms\u0131z olarak, Promise \u00e7\u00f6z\u00fcld\u00fc\u011f\u00fcnde her zaman \u00e7a\u011fr\u0131lacak bir callback fonksiyonu kaydetmek i\u00e7in kullan\u0131l\u0131r. Genellikle temizlik i\u015flemleri (\u00f6rne\u011fin, y\u00fckleme g\u00f6stergesini gizleme, kaynaklar\u0131 serbest b\u0131rakma) i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-javascript\">function birIslem() {\n  return new Promise((resolve, reject) => {\n    const basarili = Math.random() > 0.5;\n    setTimeout(() => {\n      if (basarili) {\n        resolve('\u0130\u015flem ba\u015far\u0131yla bitti.');\n      } else {\n        reject(new Error('\u0130\u015flem ba\u015far\u0131s\u0131z oldu.'));\n      }\n    }, 1500);\n  });\n}\n\nbirIslem()\n  .then(sonuc => {\n    console.log(sonuc);\n  })\n  .catch(hata => {\n    console.error('Hata:', hata.message);\n  })\n  .finally(() => {\n    console.log('\u0130\u015flem tamamland\u0131 (ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z).');\n    \/\/ Burada loading spinner'\u0131 gizleyebilir veya ba\u015fka temizlik yapabiliriz.\n  });<\/code><\/pre>\n<p><code>.finally()<\/code> callback&#8217;i, Promise&#8217;\u0131n de\u011ferini veya hata nedenini arg\u00fcman olarak almaz. Kendisi de bir Promise d\u00f6nd\u00fcrebilir ve bu Promise&#8217;\u0131n \u00e7\u00f6z\u00fclmesini bekler.<\/p>\n<h3>Promise API&#8217;leri<\/h3>\n<p>JavaScript, birden fazla Promise&#8217;\u0131 ayn\u0131 anda y\u00f6netmek i\u00e7in baz\u0131 kullan\u0131\u015fl\u0131 statik Promise metodlar\u0131 sunar.<\/p>\n<h4><code>Promise.all(iterable)<\/code><\/h4>\n<p><code>Promise.all()<\/code>, bir dizi Promise&#8217;\u0131 (veya Promise benzeri de\u011ferleri) arg\u00fcman olarak al\u0131r ve bu Promise&#8217;lar\u0131n hepsi ba\u015far\u0131l\u0131 bir \u015fekilde tamamland\u0131\u011f\u0131nda \u00e7\u00f6z\u00fclen yeni bir Promise d\u00f6nd\u00fcr\u00fcr. Sonu\u00e7, orijinal Promise&#8217;lar\u0131n s\u0131ras\u0131na g\u00f6re de\u011ferlerini i\u00e7eren bir dizidir.<\/p>\n<p>E\u011fer verilen Promise&#8217;lardan herhangi biri reddedilirse, <code>Promise.all()<\/code> hemen reddedilir ve ilk reddedilen Promise&#8217;\u0131n hata nedenini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const promise1 = Promise.resolve(3);\nconst promise2 = 42; \/\/ Otomatik olarak \u00e7\u00f6z\u00fcmlenmi\u015f bir Promise gibi davran\u0131r\nconst promise3 = new Promise((resolve, reject) => {\n  setTimeout(resolve, 100, 'foo');\n});\n\nPromise.all([promise1, promise2, promise3])\n  .then(values => {\n    console.log('Promise.all sonu\u00e7lar\u0131:', values); \/\/ [3, 42, \"foo\"]\n  })\n  .catch(error => {\n    console.error('Promise.all hatas\u0131:', error);\n  });\n\n\/\/ Hata senaryosu\nconst p1 = new Promise(resolve => setTimeout(() => resolve('P1'), 1000));\nconst p2 = new Promise((resolve, reject) => setTimeout(() => reject('P2 Hatas\u0131'), 500)); \/\/ Daha h\u0131zl\u0131 reddedilir\nconst p3 = new Promise(resolve => setTimeout(() => resolve('P3'), 1500));\n\nPromise.all([p1, p2, p3])\n  .then(values => console.log(values))\n  .catch(error => console.error('Promise.all hata (P2):', error)); \/\/ P2 Hatas\u0131<\/code><\/pre>\n<p><code>Promise.all()<\/code> genellikle birden fazla API \u00e7a\u011fr\u0131s\u0131n\u0131 paralel olarak yapman\u0131z ve hepsinin sonucuna ihtiyac\u0131n\u0131z oldu\u011funda kullan\u0131l\u0131r.<\/p>\n<h4><code>Promise.race(iterable)<\/code><\/h4>\n<p><code>Promise.race()<\/code>, bir dizi Promise&#8217;\u0131 arg\u00fcman olarak al\u0131r ve bu Promise&#8217;lardan herhangi biri ilk \u00e7\u00f6z\u00fcld\u00fc\u011f\u00fcnde veya reddedildi\u011finde \u00e7\u00f6z\u00fclen\/reddedilen yeni bir Promise d\u00f6nd\u00fcr\u00fcr. &#8220;Yar\u0131\u015f\u0131&#8221; kazanan Promise&#8217;\u0131n sonucunu (de\u011fer veya hata) d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const pA = new Promise(resolve => setTimeout(() => resolve('A bitti'), 1000));\nconst pB = new Promise(resolve => setTimeout(() => resolve('B bitti'), 50));\nconst pC = new Promise((resolve, reject) => setTimeout(() => reject('C hata'), 200));\n\nPromise.race([pA, pB, pC])\n  .then(value => {\n    console.log('Promise.race kazanan\u0131:', value); \/\/ B bitti\n  })\n  .catch(error => {\n    console.error('Promise.race hatas\u0131:', error);\n  });\n\n\/\/ Hata kazanan senaryosu\nconst pX = new Promise(resolve => setTimeout(() => resolve('X bitti'), 1000));\nconst pY = new Promise((resolve, reject) => setTimeout(() => reject('Y hata'), 50));\n\nPromise.race([pX, pY])\n  .then(value => console.log(value))\n  .catch(error => console.error('Promise.race hata (Y):', error)); \/\/ Y hata<\/code><\/pre>\n<p><code>Promise.race()<\/code> genellikle bir i\u015flemin belirli bir s\u00fcre i\u00e7inde tamamlanmas\u0131n\u0131 beklemek (zaman a\u015f\u0131m\u0131) veya ayn\u0131 g\u00f6revi farkl\u0131 kaynaklardan isteyip en h\u0131zl\u0131 yan\u0131t\u0131 almak istedi\u011finizde kullan\u0131l\u0131r.<\/p>\n<h4><code>Promise.allSettled(iterable)<\/code> (ES2020)<\/h4>\n<p><code>Promise.allSettled()<\/code>, bir dizi Promise&#8217;\u0131 arg\u00fcman olarak al\u0131r ve t\u00fcm Promise&#8217;lar tamamland\u0131\u011f\u0131nda (ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z) \u00e7\u00f6z\u00fclen yeni bir Promise d\u00f6nd\u00fcr\u00fcr. Sonu\u00e7, her bir Promise&#8217;\u0131n durumunu ve de\u011ferini\/nedenini a\u00e7\u0131klayan bir nesne dizisidir.<\/p>\n<p>Her sonu\u00e7 nesnesi \u015fu formattad\u0131r:<br \/>\n*   <code>{ status: 'fulfilled', value: sonu\u00e7De\u011feri }<\/code><br \/>\n*   <code>{ status: 'rejected', reason: hataNedeni }<\/code><\/p>\n<pre><code class=\"language-javascript\">const p1 = new Promise(resolve => setTimeout(() => resolve('P1 ba\u015far\u0131l\u0131'), 1000));\nconst p2 = new Promise((resolve, reject) => setTimeout(() => reject('P2 ba\u015far\u0131s\u0131z'), 500));\nconst p3 = Promise.resolve('P3 hemen ba\u015far\u0131l\u0131');\n\nPromise.allSettled([p1, p2, p3])\n  .then(results => {\n    console.log('Promise.allSettled sonu\u00e7lar\u0131:');\n    results.forEach((result, index) => {\n      if (result.status === 'fulfilled') {\n        console.log(<code>Promise ${index + 1} ba\u015far\u0131l\u0131:<\/code>, result.value);\n      } else {\n        console.error(<code>Promise ${index + 1} ba\u015far\u0131s\u0131z:<\/code>, result.reason);\n      }\n    });\n  });\n\/*\n\u00c7\u0131kt\u0131:\nPromise.allSettled sonu\u00e7lar\u0131:\nPromise 3 ba\u015far\u0131l\u0131: P3 hemen ba\u015far\u0131l\u0131\nPromise 2 ba\u015far\u0131s\u0131z: P2 ba\u015far\u0131s\u0131z\nPromise 1 ba\u015far\u0131l\u0131: P1 ba\u015far\u0131l\u0131\n*\/<\/code><\/pre>\n<p><code>Promise.allSettled()<\/code> genellikle t\u00fcm i\u015flemlerin sonucunu bilmeniz gerekti\u011finde, baz\u0131lar\u0131 ba\u015far\u0131s\u0131z olsa bile, kullan\u0131l\u0131r.<\/p>\n<h4><code>Promise.any(iterable)<\/code> (ES2021)<\/h4>\n<p><code>Promise.any()<\/code>, bir dizi Promise&#8217;\u0131 arg\u00fcman olarak al\u0131r ve bu Promise&#8217;lardan herhangi biri ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7\u00f6z\u00fcld\u00fc\u011f\u00fcnde \u00e7\u00f6z\u00fclen yeni bir Promise d\u00f6nd\u00fcr\u00fcr. \u0130lk ba\u015far\u0131l\u0131 olan Promise&#8217;\u0131n de\u011ferini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>E\u011fer verilen t\u00fcm Promise&#8217;lar reddedilirse, <code>Promise.any()<\/code> reddedilir ve bir <code>AggregateError<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr. Bu hata nesnesi, t\u00fcm reddedilme nedenlerini i\u00e7eren bir <code>errors<\/code> \u00f6zelli\u011fine sahiptir.<\/p>\n<pre><code class=\"language-javascript\">const pR1 = new Promise((resolve, reject) => setTimeout(() => reject('Hata 1'), 100));\nconst pR2 = new Promise((resolve, reject) => setTimeout(() => reject('Hata 2'), 200));\nconst pS3 = new Promise(resolve => setTimeout(() => resolve('Ba\u015far\u0131l\u0131 3'), 300));\n\nPromise.any([pR1, pR2, pS3])\n  .then(value => {\n    console.log('Promise.any kazanan\u0131:', value); \/\/ Ba\u015far\u0131l\u0131 3\n  })\n  .catch(error => {\n    console.error('Promise.any hatas\u0131:', error);\n  });\n\n\/\/ T\u00fcm Promise'lar\u0131n reddedildi\u011fi senaryo\nconst pFail1 = new Promise((resolve, reject) => setTimeout(() => reject('A ba\u015far\u0131s\u0131z'), 100));\nconst pFail2 = new Promise((resolve, reject) => setTimeout(() => reject('B ba\u015far\u0131s\u0131z'), 200));\n\nPromise.any([pFail1, pFail2])\n  .then(value => console.log(value))\n  .catch(error => {\n    console.error('Promise.any t\u00fcm\u00fc ba\u015far\u0131s\u0131z:', error.errors); \/\/ ['A ba\u015far\u0131s\u0131z', 'B ba\u015far\u0131s\u0131z']\n  });<\/code><\/pre>\n<p><code>Promise.any()<\/code> genellikle birden fazla kaynaktan veri almay\u0131 denedi\u011finizde ve bunlardan en az birinin ba\u015far\u0131l\u0131 olmas\u0131n\u0131 bekledi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4><code>Promise.resolve(value)<\/code> ve <code>Promise.reject(reason)<\/code><\/h4>\n<p>Bu metodlar, hemen \u00e7\u00f6z\u00fcmlenmi\u015f veya hemen reddedilmi\u015f Promise&#8217;lar olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>*   <code>Promise.resolve(value)<\/code>: Verilen <code>value<\/code> ile hemen ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7\u00f6z\u00fcmlenmi\u015f bir Promise d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>Promise.reject(reason)<\/code>: Verilen <code>reason<\/code> ile hemen reddedilmi\u015f bir Promise d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">Promise.resolve('Hemen ba\u015far\u0131l\u0131!')\n  .then(val => console.log(val)); \/\/ Hemen ba\u015far\u0131l\u0131!\n\nPromise.reject(new Error('Hemen ba\u015far\u0131s\u0131z!'))\n  .catch(err => console.error(err.message)); \/\/ Hemen ba\u015far\u0131s\u0131z!<\/code><\/pre>\n<p>Bu metodlar, bazen bir fonksiyonun her zaman bir Promise d\u00f6nd\u00fcrmesini garanti etmek istedi\u011finizde veya Promise tabanl\u0131 bir API&#8217;yi test ederken kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>Hata Y\u00f6netimi<\/h3>\n<p>Promise&#8217;larda hata y\u00f6netimi, <code>.catch()<\/code> metodunun kullan\u0131m\u0131yla olduk\u00e7a basitle\u015fir. Bir Promise zincirinde herhangi bir yerde bir hata meydana gelirse (yani bir Promise reddedilirse veya bir callback i\u00e7inde bir hata f\u0131rlat\u0131l\u0131rsa), kontrol zincirdeki bir sonraki <code>.catch()<\/code> handler&#8217;\u0131na atlar.<\/p>\n<pre><code class=\"language-javascript\">function rastgeleHataUret() {\n  return new Promise((resolve, reject) => {\n    const shouldFail = Math.random() > 0.5;\n    setTimeout(() => {\n      if (shouldFail) {\n        reject(new Error('Rastgele bir hata olu\u015ftu!'));\n      } else {\n        resolve('\u0130\u015flem ba\u015far\u0131yla devam ediyor.');\n      }\n    }, 500);\n  });\n}\n\nrastgeleHataUret()\n  .then(sonuc => {\n    console.log('\u0130lk ad\u0131m:', sonuc);\n    return rastgeleHataUret(); \/\/ \u0130kinci bir Promise d\u00f6nd\u00fcr\n  })\n  .then(sonuc => {\n    console.log('\u0130kinci ad\u0131m:', sonuc);\n    \/\/ Burada senkron bir hata f\u0131rlatabiliriz\n    if (Math.random() > 0.5) {\n      throw new Error('\u0130kinci ad\u0131mda senkron hata!');\n    }\n    return 'T\u00fcm ad\u0131mlar tamamland\u0131.';\n  })\n  .then(finalSonuc => {\n    console.log('Nihai sonu\u00e7:', finalSonuc);\n  })\n  .catch(hata => {\n    console.error('Zincirde genel bir hata yakaland\u0131:', hata.message);\n    \/\/ Hata yakaland\u0131ktan sonra zinciri devam ettirmek istiyorsak\n    \/\/ burada bir de\u011fer d\u00f6nd\u00fcrebiliriz (ba\u015far\u0131l\u0131 Promise gibi davran\u0131r)\n    \/\/ return 'Hatadan sonra devam edildi.';\n  })\n  .then(sonrakiAdim => {\n    \/\/ E\u011fer .catch() bir de\u011fer d\u00f6nd\u00fcr\u00fcrse bu ad\u0131m \u00e7al\u0131\u015f\u0131r\n    \/\/ console.log('Catch sonras\u0131:', sonrakiAdim);\n  })\n  .finally(() => {\n    console.log('T\u00fcm ak\u0131\u015f sona erdi.');\n  });<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, zincirdeki herhangi bir ad\u0131mda bir hata olu\u015fsa veya f\u0131rlat\u0131lsa bile, en sondaki <code>.catch()<\/code> blo\u011fu bu hatay\u0131 yakalayacakt\u0131r. Bu, her bir asenkron i\u015flem i\u00e7in ayr\u0131 ayr\u0131 hata kontrol\u00fc yapma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve kodun \u00e7ok daha temiz olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>Yakalanmayan Promise Redleri (Unhandled Promise Rejections):<\/strong> E\u011fer bir Promise reddedilir ve zincirde bu hatay\u0131 yakalayacak hi\u00e7bir <code>.catch()<\/code> handler&#8217;\u0131 yoksa, bu bir &#8220;yakalanmayan Promise reddi&#8221; olarak kabul edilir. Taray\u0131c\u0131larda bu genellikle konsolda bir uyar\u0131 veya hata mesaj\u0131yla sonu\u00e7lan\u0131r (<code>unhandledrejection<\/code> olay\u0131). Node.js&#8217;te ise uygulaman\u0131n \u00e7\u00f6kmesine neden olabilir (<code>unhandledRejection<\/code> olay\u0131). Bu nedenle, her zaman Promise zincirlerinizin sonunda bir <code>.catch()<\/code> blo\u011fu bulundurman\u0131z \u015fiddetle tavsiye edilir.<\/p>\n<h3>Async\/Await ile Promise&#8217;lar\u0131 Daha Kolay Kullanma<\/h3>\n<p>ES2017 ile tan\u0131t\u0131lan <code>async<\/code> ve <code>await<\/code> anahtar kelimeleri, Promise&#8217;lar \u00fczerinde daha da okunabilir ve senkron g\u00f6r\u00fcn\u00fcml\u00fc kod yazmam\u0131z\u0131 sa\u011flayan sentaktik \u015fekerdir (syntactic sugar). Temelinde Promise&#8217;lara dayan\u0131r, ancak onlar\u0131 kullanma \u015feklimizi k\u00f6kten de\u011fi\u015ftirir.<\/p>\n<h4><code>async<\/code> Anahtar Kelimesi<\/h4>\n<p>Bir fonksiyonun \u00f6n\u00fcne <code>async<\/code> anahtar kelimesini eklemek, o fonksiyonun her zaman bir Promise d\u00f6nd\u00fcrmesini sa\u011flar. Fonksiyon i\u00e7inde <code>return<\/code> ile d\u00f6nen herhangi bir de\u011fer, ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7\u00f6z\u00fcmlenmi\u015f bir Promise&#8217;\u0131n de\u011feri olur. Fonksiyon i\u00e7inde f\u0131rlat\u0131lan bir hata ise reddedilmi\u015f bir Promise&#8217;a d\u00f6n\u00fc\u015f\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">async function selamVer() {\n  return 'Merhaba D\u00fcnya!'; \/\/ Promise.resolve('Merhaba D\u00fcnya!') d\u00f6nd\u00fcr\u00fcr\n}\n\nselamVer().then(mesaj => console.log(mesaj)); \/\/ Merhaba D\u00fcnya!\n\nasync function hataFirlat() {\n  throw new Error('Async fonksiyonda hata!'); \/\/ Promise.reject(Error) d\u00f6nd\u00fcr\u00fcr\n}\n\nhataFirlat().catch(hata => console.error(hata.message)); \/\/ Async fonksiyonda hata!<\/code><\/pre>\n<h4><code>await<\/code> Anahtar Kelimesi<\/h4>\n<p><code>await<\/code> anahtar kelimesi, yaln\u0131zca <code>async<\/code> fonksiyonlar i\u00e7inde kullan\u0131labilir. Bir Promise&#8217;\u0131n \u00e7\u00f6z\u00fclmesini (yani <code>fulfilled<\/code> veya <code>rejected<\/code> durumuna ge\u00e7mesini) bekler. Promise \u00e7\u00f6z\u00fcld\u00fc\u011f\u00fcnde, <code>await<\/code> Promise&#8217;\u0131n de\u011ferini d\u00f6nd\u00fcr\u00fcr. E\u011fer Promise reddedilirse, <code>await<\/code> bir hata f\u0131rlat\u0131r.<\/p>\n<p>Bu, asenkron kodu senkron kod gibi ard\u0131\u015f\u0131k bir \u015fekilde yazmam\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">function gecikmeliMesaj(mesaj, sure) {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve(mesaj);\n    }, sure);\n  });\n}\n\nasync function siraliIslemler() {\n  console.log('\u0130\u015flemler ba\u015fl\u0131yor...');\n  try {\n    const mesaj1 = await gecikmeliMesaj('\u0130lk mesaj', 1000);\n    console.log(mesaj1); \/\/ 1 saniye sonra: \u0130lk mesaj\n\n    const mesaj2 = await gecikmeliMesaj('\u0130kinci mesaj', 500);\n    console.log(mesaj2); \/\/ 0.5 saniye sonra: \u0130kinci mesaj\n\n    const mesaj3 = await gecikmeliMesaj('\u00dc\u00e7\u00fcnc\u00fc mesaj', 700);\n    console.log(mesaj3); \/\/ 0.7 saniye sonra: \u00dc\u00e7\u00fcnc\u00fc mesaj\n\n    console.log('T\u00fcm i\u015flemler tamamland\u0131.');\n    return 'Ba\u015far\u0131l\u0131!';\n  } catch (hata) {\n    console.error('Bir hata olu\u015ftu:', hata);\n    throw hata; \/\/ Hatay\u0131 tekrar f\u0131rlatarak async fonksiyonun reddedilmesini sa\u011flar\u0131z\n  }\n}\n\nsiraliIslemler()\n  .then(sonuc => console.log('Async fonksiyon sonucu:', sonuc))\n  .catch(hata => console.error('Async fonksiyon hatas\u0131:', hata));<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>await<\/code> anahtar kelimesi sayesinde <code>gecikmeliMesaj<\/code> Promise&#8217;lar\u0131 senkron bir \u015fekilde \u00e7a\u011fr\u0131lm\u0131\u015f gibi g\u00f6r\u00fcn\u00fcr. Her <code>await<\/code>, bir \u00f6nceki Promise \u00e7\u00f6z\u00fclene kadar fonksiyonun y\u00fcr\u00fct\u00fclmesini duraklat\u0131r (ancak ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke etmez).<\/p>\n<h4>Async\/Await ile Hata Y\u00f6netimi<\/h4>\n<p><code>async\/await<\/code> kullan\u0131rken hata y\u00f6netimi, geleneksel <code>try...catch<\/code> bloklar\u0131 ile yap\u0131l\u0131r. Bir <code>await<\/code> ifadesi bir reddedilmi\u015f Promise ile kar\u015f\u0131la\u015f\u0131rsa, bir hata f\u0131rlat\u0131r ve bu hata <code>try...catch<\/code> blo\u011fu taraf\u0131ndan yakalanabilir.<\/p>\n<pre><code class=\"language-javascript\">function hataYapanIslem(basariliMi) {\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      if (basariliMi) {\n        resolve('Veri al\u0131nd\u0131.');\n      } else {\n        reject(new Error('Veri alma hatas\u0131!'));\n      }\n    }, 1000);\n  });\n}\n\nasync function veriIsle() {\n  try {\n    const veri = await hataYapanIslem(false); \/\/ Buras\u0131 hata f\u0131rlatacak\n    console.log(veri);\n  } catch (hata) {\n    console.error('Hata yakaland\u0131:', hata.message); \/\/ Hata yakaland\u0131: Veri alma hatas\u0131!\n  } finally {\n    console.log('\u0130\u015flem sona erdi.');\n  }\n}\n\nveriIsle();<\/code><\/pre>\n<h4>Async\/Await ile Paralel \u0130\u015flemler<\/h4>\n<p><code>await<\/code> her ne kadar kodu senkron gibi g\u00f6sterse de, paralel i\u015flemlere engel de\u011fildir. Birden fazla Promise&#8217;\u0131 paralel \u00e7al\u0131\u015ft\u0131rmak ve sonu\u00e7lar\u0131n\u0131 beklemek i\u00e7in <code>Promise.all()<\/code>&#8216;\u0131 <code>await<\/code> ile birlikte kullanabiliriz:<\/p>\n<pre><code class=\"language-javascript\">async function paralelVeriGetir() {\n  console.log('Paralel veri getirme ba\u015fl\u0131yor...');\n  try {\n    const [kullaniciVerisi, urunVerisi] = await Promise.all([\n      fetch('https:\/\/api.example.com\/users\/1').then(res => res.json()),\n      fetch('https:\/\/api.example.com\/products\/abc').then(res => res.json())\n    ]);\n\n    console.log('Kullan\u0131c\u0131 Verisi:', kullaniciVerisi);\n    console.log('\u00dcr\u00fcn Verisi:', urunVerisi);\n    console.log('T\u00fcm veriler paralel olarak getirildi.');\n  } catch (hata) {\n    console.error('Paralel veri getirme hatas\u0131:', hata);\n  }\n}\n\n\/\/ paralelVeriGetir(); \/\/ Ger\u00e7ek bir API olmad\u0131\u011f\u0131 i\u00e7in \u00e7al\u0131\u015fmayacakt\u0131r.<\/code><\/pre>\n<p><code>async\/await<\/code>, Promise tabanl\u0131 kodu yazman\u0131n en modern ve okunabilir yoludur. \u00c7o\u011fu yeni JavaScript projesinde asenkron kod yazarken tercih edilen yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Promise&#8217;lar ve Ger\u00e7ek D\u00fcnya Uygulamalar\u0131<\/h3>\n<p>Promise&#8217;lar, modern web geli\u015ftirmenin bir\u00e7ok alan\u0131nda temel bir rol oynar:<\/p>\n<p>*   <strong>API \u00c7a\u011fr\u0131lar\u0131:<\/strong> <code>fetch<\/code> API&#8217;si varsay\u0131lan olarak Promise tabanl\u0131d\u0131r. Axios gibi HTTP istemci k\u00fct\u00fcphaneleri de Promise&#8217;lar\u0131 yo\u011fun bir \u015fekilde kullan\u0131r.<br \/>\n*   <strong>Veritaban\u0131 \u0130\u015flemleri:<\/strong> Node.js&#8217;teki \u00e7o\u011fu veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc (MongoDB, PostgreSQL, MySQL vb.) asenkron i\u015flemleri Promise&#8217;lar arac\u0131l\u0131\u011f\u0131yla y\u00f6netir.<br \/>\n*   <strong>Dosya Okuma\/Yazma:<\/strong> Node.js&#8217;in <code>fs\/promises<\/code> mod\u00fcl\u00fc, dosya sistemi i\u015flemlerini Promise tabanl\u0131 API&#8217;lerle sunar.<br \/>\n*   <strong>Zamanlay\u0131c\u0131lar:<\/strong> <code>setTimeout<\/code> veya <code>setInterval<\/code> gibi yerle\u015fik fonksiyonlar\u0131 Promise&#8217;lara d\u00f6n\u00fc\u015ft\u00fcren yard\u0131mc\u0131 fonksiyonlar yaz\u0131labilir.<br \/>\n*   <strong>Animasyonlar ve Gecikmeli \u0130\u015flemler:<\/strong> Kullan\u0131c\u0131 aray\u00fcz\u00fcnde belirli bir gecikmeyle veya bir dizi animasyonun s\u0131rayla \u00e7al\u0131\u015fmas\u0131 gerekti\u011finde Promise&#8217;lar kullan\u0131l\u0131r.<\/p>\n<h3>Anti-Pattern&#8217;ler ve En \u0130yi Uygulamalar<\/h3>\n<p>Promise&#8217;lar\u0131 etkili bir \u015fekilde kullanmak i\u00e7in baz\u0131 anti-pattern&#8217;lerden ka\u00e7\u0131nmak ve en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir.<\/p>\n<h4>Anti-Pattern&#8217;ler:<\/h4>\n<p>*   <strong>Callback Hell&#8217;e geri d\u00f6nmek:<\/strong> Promise&#8217;lar\u0131 <code>new Promise<\/code> i\u00e7ine gereksiz yere sarmak veya <code>.then()<\/code> i\u00e7inde tekrar callback tarz\u0131 kod yazmak.<br \/>\n*   <strong><code>.catch()<\/code> kullanmamak:<\/strong> Zincirdeki hatalar\u0131 yakalamamak, uygulaman\u0131z\u0131n beklenmedik \u015fekillerde \u00e7\u00f6kmesine veya hatalar\u0131n sessizce yutulmas\u0131na neden olabilir.<br \/>\n*   <strong>Promise&#8217;lar\u0131 gereksiz yere sarmak:<\/strong> Zaten Promise d\u00f6nd\u00fcren bir fonksiyonu <code>new Promise<\/code> ile sarmalamak gereksizdir ve kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Promise i\u00e7inden senkron hata f\u0131rlatmak:<\/strong> <code>new Promise((resolve, reject) => { throw new Error('Hata'); })<\/code> yerine <code>reject(new Error('Hata'))<\/code> kullanmak daha tutarl\u0131d\u0131r.<\/p>\n<h4>En \u0130yi Uygulamalar:<\/h4>\n<p>*   <strong>Her zaman <code>.catch()<\/code> kullan\u0131n:<\/strong> \u00d6zellikle uzun Promise zincirlerinin sonunda veya <code>async<\/code> fonksiyonlar\u0131n\u0131z\u0131n ana g\u00f6vdesinde bir <code>try...catch<\/code> blo\u011fu bulundurun.<br \/>\n*   <strong>Promise&#8217;lar\u0131 zincirleyin:<\/strong> Okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131rmak i\u00e7in <code>.then()<\/code> ve <code>.catch()<\/code> metodlar\u0131n\u0131 kullanarak Promise&#8217;lar\u0131 zincirleyin.<br \/>\n*   <strong>Async\/await&#8217;i tercih edin:<\/strong> M\u00fcmk\u00fcn oldu\u011funda, Promise tabanl\u0131 asenkron kodu daha okunabilir ve senkron g\u00f6r\u00fcn\u00fcml\u00fc hale getirmek i\u00e7in <code>async\/await<\/code> kullan\u0131n.<br \/>\n*   <strong>Anlaml\u0131 hata mesajlar\u0131 ve t\u00fcrleri kullan\u0131n:<\/strong> Hatalar\u0131 yakalad\u0131\u011f\u0131n\u0131zda, sorunun kayna\u011f\u0131n\u0131 kolayca anlamak i\u00e7in <code>Error<\/code> nesnelerini ve a\u00e7\u0131klay\u0131c\u0131 hata mesajlar\u0131n\u0131 kullan\u0131n.<br \/>\n*   <strong>Mod\u00fcler ve yeniden kullan\u0131labilir Promise&#8217;lar olu\u015fturun:<\/strong> Tek bir sorumlulu\u011fu olan Promise d\u00f6nd\u00fcren fonksiyonlar yazarak kodunuzu daha y\u00f6netilebilir hale getirin.<br \/>\n*   <strong>Promise&#8217;lar\u0131 erken d\u00f6nd\u00fcr\u00fcn:<\/strong> Bir Promise d\u00f6nd\u00fcren bir fonksiyon yaz\u0131yorsan\u0131z, Promise&#8217;\u0131 m\u00fcmk\u00fcn oldu\u011funca erken <code>return<\/code> edin, b\u00f6ylece zincirleme yetene\u011fi korunur.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>JavaScript Promise&#8217;lar\u0131, asenkron programlamay\u0131 y\u00f6netmek i\u00e7in devrim niteli\u011finde bir soyutlama sunmu\u015ftur. Callback&#8217;lerin getirdi\u011fi &#8220;Callback Hell&#8221; sorununa zarif bir \u00e7\u00f6z\u00fcm getirerek, asenkron kodun okunabilirli\u011fini, hata y\u00f6netimini ve ak\u0131\u015f kontrol\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirmi\u015ftir.<\/p>\n<p>Promise&#8217;lar\u0131n durumlar\u0131n\u0131 anlamak (<code>pending<\/code>, <code>fulfilled<\/code>, <code>rejected<\/code>), <code>.then()<\/code>, <code>.catch()<\/code> ve <code>.finally()<\/code> metodlar\u0131yla nas\u0131l zincirleneceklerini bilmek, asenkron JavaScript&#8217;i etkili bir \u015fekilde kullanman\u0131n temelini olu\u015fturur. <code>Promise.all()<\/code>, <code>Promise.race()<\/code>, <code>Promise.allSettled()<\/code> ve <code>Promise.any()<\/code> gibi statik metodlar ise daha karma\u015f\u0131k asenkron senaryolar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar.<\/p>\n<p>Son olarak, <code>async<\/code> ve <code>await<\/code> anahtar kelimeleri, Promise&#8217;lar \u00fczerinde bir katman daha ekleyerek, asenkron kodu senkron kod gibi yazma imkan\u0131 sa\u011flam\u0131\u015f ve modern JavaScript&#8217;te asenkron programlamay\u0131 neredeyse zahmetsiz hale getirmi\u015ftir.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz web geli\u015ftirme d\u00fcnyas\u0131nda, API \u00e7a\u011fr\u0131lar\u0131ndan veritaban\u0131 i\u015flemlerine kadar bir\u00e7ok alanda asenkron i\u015flemler ka\u00e7\u0131n\u0131lmazd\u0131r. JavaScript Promise&#8217;lar\u0131n\u0131 ve <code>async\/await<\/code> yap\u0131s\u0131n\u0131 derinlemesine anlamak, daha sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 uygulamalar geli\u015ftirmek i\u00e7in her JavaScript geli\u015ftiricisinin sahip olmas\u0131 gereken kritik bir beceridir. Bu ara\u00e7lar, JavaScript&#8217;in tek i\u015f par\u00e7ac\u0131kl\u0131 do\u011fas\u0131n\u0131 avantaja \u00e7evirerek, kullan\u0131c\u0131 dostu ve h\u0131zl\u0131 uygulamalar\u0131n kap\u0131s\u0131n\u0131 aralar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131\nJavaScript, web taray\u0131c\u0131lar\u0131nda etkile\u015fimli kullan\u0131c\u0131 deneyimleri sa","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":[129],"tags":[],"class_list":{"0":"post-35249","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","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>JavaScript Promise&#039;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript Promise&#039;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131\" \/>\n<meta property=\"og:description\" content=\"JavaScript Promise&#039;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131 JavaScript, web taray\u0131c\u0131lar\u0131nda etkile\u015fimli kullan\u0131c\u0131 deneyimleri sa\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-27T08:40:57+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131\",\"datePublished\":\"2025-11-27T08:40:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\"},\"wordCount\":2780,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\",\"name\":\"JavaScript Promise'lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-27T08:40:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\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":"JavaScript Promise'lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript Promise'lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131","og_description":"JavaScript Promise'lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131 JavaScript, web taray\u0131c\u0131lar\u0131nda etkile\u015fimli kullan\u0131c\u0131 deneyimleri sa","og_url":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-27T08:40:57+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131","datePublished":"2025-11-27T08:40:57+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/"},"wordCount":2780,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/","url":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/","name":"JavaScript Promise'lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-27T08:40:57+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-promiselarini-anlamak-asenkron-programlamanin-temel-tasi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript Promise&#8217;lar\u0131n\u0131 Anlamak: Asenkron Programlaman\u0131n Temel Ta\u015f\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\/35249","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=35249"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35249\/revisions"}],"predecessor-version":[{"id":35250,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35249\/revisions\/35250"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}