{"id":34386,"date":"2025-11-16T02:31:10","date_gmt":"2025-11-15T23:31:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/"},"modified":"2025-11-16T02:31:10","modified_gmt":"2025-11-15T23:31:10","slug":"async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/","title":{"rendered":"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m"},"content":{"rendered":"<p>Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?<\/p>\n<p>Hayat\u0131m\u0131zdaki bir\u00e7ok sistem gibi, yaz\u0131l\u0131m d\u00fcnyas\u0131nda da i\u015flemlerin nas\u0131l y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcn\u00fc a\u00e7\u0131klayan iki temel d\u00fczen vard\u0131r: Senkron (e\u015f zamanl\u0131) ve Asenkron (e\u015f zamans\u0131z). Bu kavramlar\u0131 anlamak i\u00e7in gelin, kendimizi yo\u011fun bir restorandaki yemek sipari\u015fi s\u00fcrecine b\u0131rakal\u0131m.<\/p>\n<p><strong>Senkron Restoran Deneyimi: Her \u015eey S\u0131rayla<\/strong><\/p>\n<p>Senkron bir restoranda, bir m\u00fc\u015fteri sipari\u015f verdi\u011finde mutfaktaki a\u015f\u00e7\u0131 o yeme\u011fi tamamen bitirmeden ba\u015fka hi\u00e7bir i\u015fe ba\u015flamaz. Diyelim ki peynirli tost ve ard\u0131ndan \u00e7orba sipari\u015f ettiniz. A\u015f\u00e7\u0131 \u00f6nce tostu haz\u0131rlayacak, pi\u015firecek ve servis edilebilir hale getirecek. Bu s\u00fcre\u00e7te mutfakta ba\u015fka hi\u00e7bir aktivite ger\u00e7ekle\u015femez. Tost masan\u0131za gelmeden \u00e7orban\u0131n yap\u0131m\u0131na ba\u015flanmaz. Bu, bir yandan bak\u0131ld\u0131\u011f\u0131nda basit ve d\u00fczenli g\u00f6r\u00fcnebilir; ancak restoran\u0131n kapasitesini ciddi \u015fekilde s\u0131n\u0131rlar ve bekleme s\u00fcrelerini uzat\u0131r. M\u00fc\u015fteri olarak siz de ilk sipari\u015finiz tamamlanana kadar di\u011fer i\u015flerinizi yapamaz, sadece beklemek zorunda kal\u0131rs\u0131n\u0131z.<\/p>\n<p>JavaScript d\u00fcnyas\u0131nda da durum benzerdir. JavaScript, varsay\u0131lan olarak &#8220;tek i\u015f par\u00e7ac\u0131kl\u0131&#8221; (single-threaded) bir dildir. Bu, bir anda sadece tek bir g\u00f6revi y\u00fcr\u00fctebilece\u011fi anlam\u0131na gelir. E\u011fer senkron bir i\u015flem uzun s\u00fcrerse (\u00f6rne\u011fin, b\u00fcy\u00fck bir dosyay\u0131 indirmek veya karma\u015f\u0131k bir hesaplama yapmak), bu i\u015flem bitene kadar di\u011fer t\u00fcm g\u00f6revler (kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc g\u00fcncellemek, t\u0131klamalara yan\u0131t vermek vb.) bloke olur. Yani, uygulaman\u0131z donar ve kullan\u0131c\u0131n\u0131n etkile\u015fimi yan\u0131t vermez. \u0130\u015fte bu &#8220;donma&#8221; durumu, Swiggy gibi uygulamalarda asla istemeyece\u011fimiz bir durumdur.<\/p>\n<p><strong>Asenkron Restoran Deneyimi: Ak\u0131ll\u0131 \u0130\u015f B\u00f6l\u00fcm\u00fc ve Paralel Y\u00f6netim<\/strong><\/p>\n<p>\u015eimdi de asenkron bir restorana ge\u00e7elim. Swiggy veya Zomato&#8217;nun mutfaklar\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcn. Siz peynirli tost ve \u00e7orba sipari\u015f etti\u011finizde, mutfaktaki a\u015f\u00e7\u0131 tostu f\u0131r\u0131na verir ve pi\u015fmesini beklerken hemen \u00e7orbay\u0131 haz\u0131rlamaya ba\u015flar. Hatta belki de ba\u015fka bir masan\u0131n salatas\u0131n\u0131 yapmaya bile koyulur. A\u015f\u00e7\u0131, &#8220;toast pi\u015fti\u011finde beni uyar&#8221; veya &#8220;\u00e7orba kaynad\u0131\u011f\u0131nda haber ver&#8221; gibi talimatlar verir ve bu g\u00f6revler arka planda y\u00fcr\u00fct\u00fcl\u00fcrken di\u011fer i\u015flere odaklan\u0131r. Bir yemek haz\u0131r oldu\u011funda, garson onu hemen masan\u0131za getirir. Bu s\u0131rada siz di\u011fer yeme\u011finizi beklerken telefonunuza bakabilir, arkada\u015flar\u0131n\u0131zla sohbet edebilir veya uygulaman\u0131n ba\u015fka yerlerini gezebilirsiniz. Restoran hi\u00e7bir zaman &#8220;durup&#8221; tek bir i\u015fi bitirmeyi beklemez.<\/p>\n<p>Asenkron JavaScript de tam olarak b\u00f6yle \u00e7al\u0131\u015f\u0131r. Uzun s\u00fcren i\u015flemleri (\u00f6rne\u011fin, Swiggy&#8217;den restoran listesini \u00e7ekmek, bir kullan\u0131c\u0131n\u0131n konumunu belirlemek veya \u00f6deme i\u015flemini yapmak gibi a\u011f istekleri) ba\u015flat\u0131r ve bunlar\u0131 &#8220;arka plana&#8221; iter. Bu s\u0131rada ana i\u015f par\u00e7ac\u0131\u011f\u0131 serbest kal\u0131r ve kullan\u0131c\u0131 aray\u00fcz\u00fc etkile\u015fimlerine yan\u0131t vermeye devam edebilir. Uzun s\u00fcren i\u015flem tamamland\u0131\u011f\u0131nda, JavaScript&#8217;in &#8220;Olay D\u00f6ng\u00fcs\u00fc&#8221; (Event Loop) bu i\u015flemi tespit eder ve ana i\u015f par\u00e7ac\u0131\u011f\u0131 bo\u015fta oldu\u011funda sonucunu i\u015fler. B\u00f6ylece uygulaman\u0131z hi\u00e7bir zaman donmaz, kullan\u0131c\u0131 her zaman ak\u0131c\u0131 bir deneyim ya\u015far.<\/p>\n<p>Bu temel fark, modern web uygulamalar\u0131n\u0131n neden bu kadar h\u0131zl\u0131 ve tepkisel oldu\u011funu anlamak i\u00e7in kritik \u00f6neme sahiptir. Senkron blokajlardan ka\u00e7\u0131nmak, kullan\u0131c\u0131 deneyiminin anahtar\u0131d\u0131r. Dolay\u0131s\u0131yla, Swiggy&#8217;de bir yemek sipari\u015fi verdi\u011finizde aray\u00fcz\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131n arkas\u0131ndaki s\u0131r, JavaScript&#8217;in asenkron yetenekleridir.<\/p>\n<div class=\"interactive-tip\">\n  Uzman \u0130pucu: JavaScript&#8217;in tek i\u015f par\u00e7ac\u0131kl\u0131 do\u011fas\u0131n\u0131 anlamak, asenkron programlaman\u0131n neden bu kadar gerekli oldu\u011funu kavraman\u0131n ilk ad\u0131m\u0131d\u0131r. Unutmay\u0131n, JS ayn\u0131 anda sadece bir i\u015fi &#8220;aktif olarak&#8221; yapar, ancak asenkron mekanizmalar sayesinde bir\u00e7ok i\u015fi &#8220;ayn\u0131 anda bekleyebilir ve y\u00f6netebilir&#8221;.\n<\/div>\n<h2>Callback Fonksiyonlar\u0131: Garsonlar Nas\u0131l Haber Veriyor?<\/h2>\n<p>Asenkron programlaman\u0131n ilk ve en temel mekanizmalar\u0131ndan biri callback (geri arama) fonksiyonlar\u0131d\u0131r. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, bir callback fonksiyonu, belirli bir olay\u0131n ger\u00e7ekle\u015fmesi veya bir i\u015flemin tamamlanmas\u0131 durumunda \u00e7a\u011fr\u0131lmas\u0131 gereken bir fonksiyondur. Yemek sipari\u015fi analogisine geri d\u00f6nelim.<\/p>\n<p><strong>Garsonun Not Defteri ve Geri Arama Sistemi<\/strong><\/p>\n<p>Bir restoranda garsona sipari\u015f verirken, yeme\u011finiz haz\u0131r oldu\u011funda size haber verilmesini istersiniz. Garson, &#8220;Yemek haz\u0131r oldu\u011funda masan\u0131za getirece\u011fim&#8221; veya &#8220;Bu numaray\u0131 arayarak size haber verece\u011fim&#8221; der. \u0130\u015fte bu &#8220;haberdar etme&#8221; eylemi, callback fonksiyonunun \u00e7al\u0131\u015fma prensibine benzer. Siz yeme\u011finizi beklerken kendi i\u015flerinize devam edersiniz (telefonunuza bakmak, arkada\u015flar\u0131n\u0131zla sohbet etmek gibi). Yemek haz\u0131rland\u0131\u011f\u0131nda, mutfak garsona haber verir ve garson da size yeme\u011fi getirir. Bu durumda, garsonun size yeme\u011fi getirme eylemi, bir callback fonksiyonunun \u00e7a\u011fr\u0131lmas\u0131 gibidir.<\/p>\n<p>JavaScript&#8217;te callback fonksiyonlar\u0131, \u00f6zellikle eski kod tabanlar\u0131nda veya basit asenkron i\u015flemler i\u00e7in s\u0131k\u00e7a kullan\u0131l\u0131r. \u00d6rne\u011fin, bir API iste\u011fi g\u00f6nderdi\u011finizde, iste\u011fin cevab\u0131 geldi\u011finde \u00e7al\u0131\u015facak bir fonksiyonu callback olarak tan\u0131mlars\u0131n\u0131z. En bilinen \u00f6rneklerden biri <code>setTimeout<\/code> fonksiyonudur:<\/p>\n<pre><code>\n\/\/ Yemek haz\u0131rlama sim\u00fclasyonu\nfunction yemekHazirla(yemekAdi, callback) {\n  console.log(<code>${yemekAdi} haz\u0131rlan\u0131yor...<\/code>);\n  setTimeout(() => {\n    console.log(<code>${yemekAdi} haz\u0131r!<\/code>);\n    callback(yemekAdi); \/\/ Yemek haz\u0131r oldu\u011funda callback'i \u00e7a\u011f\u0131r\n  }, Math.random() * 3000 + 1000); \/\/ 1 ila 4 saniye aras\u0131 rastgele s\u00fcre\n}\n\n\/\/ Sipari\u015fleri verelim\nyemekHazirla(\"\u00c7orba\", (hazirYemek) => {\n  console.log(<code>M\u00fc\u015fteriye \"${hazirYemek}\" servis edildi.<\/code>);\n});\n\nyemekHazirla(\"Salata\", (hazirYemek) => {\n  console.log(<code>M\u00fc\u015fteriye \"${hazirYemek}\" servis edildi.<\/code>);\n});\n\nconsole.log(\"Di\u011fer m\u00fc\u015fterilere bakmaya devam ediyorum...\");\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>yemekHazirla<\/code> fonksiyonu asenkron bir i\u015flemi (yeme\u011fi haz\u0131rlama) sim\u00fcle eder. Bu i\u015flem tamamland\u0131\u011f\u0131nda, fonksiyona parametre olarak verilen <code>callback<\/code> fonksiyonu \u00e7a\u011fr\u0131l\u0131r. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>yemekHazirla<\/code> \u00e7a\u011fr\u0131ld\u0131ktan hemen sonra \"Di\u011fer m\u00fc\u015fterilere bakmaya devam ediyorum...\" mesaj\u0131 yazd\u0131r\u0131l\u0131r. Bu, ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n bloke olmad\u0131\u011f\u0131n\u0131, di\u011fer i\u015flere devam etti\u011fini g\u00f6sterir.<\/p>\n<p><strong>Callback Cehennemi (Callback Hell): Labirentteki Kay\u0131p Sipari\u015fler<\/strong><\/p>\n<p>Callback'ler basit senaryolar i\u00e7in harika olsa da, karma\u015f\u0131k veya birbirine ba\u011f\u0131ml\u0131 asenkron i\u015flemleri y\u00f6netmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131zda \"callback cehennemi\" (callback hell) denen bir durumla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu, i\u00e7 i\u00e7e ge\u00e7mi\u015f callback fonksiyonlar\u0131n\u0131n olu\u015fturdu\u011fu piramit benzeri, okunmas\u0131 ve bak\u0131m\u0131 zor bir kod yap\u0131s\u0131d\u0131r.<\/p>\n<p>\u015e\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Swiggy'den bir sipari\u015f verirken \u00f6nce restoran\u0131 se\u00e7meniz, sonra men\u00fcy\u00fc y\u00fcklemeniz, ard\u0131ndan yeme\u011fi sepete eklemeniz, sonra \u00f6deme y\u00f6ntemini se\u00e7meniz ve son olarak sipari\u015fi onaylaman\u0131z gerekir. Her ad\u0131m bir \u00f6ncekinin sonucuna ba\u011fl\u0131d\u0131r ve her bir ad\u0131m asenkron bir i\u015flem olabilir.<\/p>\n<pre><code>\nfunction restoranSec(callback) {\n  console.log(\"Restoranlar y\u00fckleniyor...\");\n  setTimeout(() => {\n    const restoran = \"Burgerc\u00fc Baba\";\n    console.log(<code>${restoran} se\u00e7ildi.<\/code>);\n    callback(null, restoran); \/\/ Hata yok, restoran bilgisi\n  }, 1000);\n}\n\nfunction menuyuGetir(restoran, callback) {\n  console.log(<code>${restoran} men\u00fcs\u00fc y\u00fckleniyor...<\/code>);\n  setTimeout(() => {\n    const menu = [\"Hamburger\", \"Patates\", \"Kola\"];\n    console.log(\"Men\u00fc y\u00fcklendi.\");\n    callback(null, menu);\n  }, 1500);\n}\n\nfunction sepeteEkle(menu, urun, callback) {\n  console.log(<code>${urun} sepete ekleniyor...<\/code>);\n  setTimeout(() => {\n    if (menu.includes(urun)) {\n      console.log(<code>${urun} sepete eklendi.<\/code>);\n      callback(null, { urun, miktar: 1 });\n    } else {\n      callback(\"\u00dcr\u00fcn men\u00fcde yok!\", null);\n    }\n  }, 800);\n}\n\nfunction siparisiOnayla(sepet, callback) {\n  console.log(\"Sipari\u015f onaylan\u0131yor...\");\n  setTimeout(() => {\n    const siparisID = Math.floor(Math.random() * 10000);\n    console.log(<code>Sipari\u015finiz ${siparisID} ile onayland\u0131!<\/code>);\n    callback(null, siparisID);\n  }, 2000);\n}\n\n\/\/ Callback Cehennemi \u00f6rne\u011fi:\nrestoranSec((err, restoran) => {\n  if (err) return console.error(err);\n  menuyuGetir(restoran, (err, menu) => {\n    if (err) return console.error(err);\n    sepeteEkle(menu, \"Hamburger\", (err, sepetUrun) => {\n      if (err) return console.error(err);\n      sepeteEkle(menu, \"Patates\", (err, sepetUrun2) => { \/\/ Bir \u00fcr\u00fcn daha ekleyelim\n        if (err) return console.error(err);\n        siparisiOnayla([sepetUrun, sepetUrun2], (err, id) => {\n          if (err) return console.error(err);\n          console.log(<code>Mutlu son! Sipari\u015f ID: ${id}<\/code>);\n        });\n      });\n    });\n  });\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011fu, birden fazla i\u00e7 i\u00e7e callback'in nas\u0131l bir \"piramit\" veya \"merdiven\" yap\u0131s\u0131 olu\u015fturdu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu yap\u0131, hem okunakl\u0131l\u0131\u011f\u0131 d\u00fc\u015f\u00fcr\u00fcr hem de hata y\u00f6netimini (her ad\u0131mda <code>if (err) return...<\/code> kontrol\u00fc) karma\u015f\u0131kla\u015ft\u0131r\u0131r. \u0130\u015fte bu noktada modern JavaScript, Promise'ler ve Async\/Await ile devreye girerek bu karma\u015f\u0131kl\u0131\u011f\u0131 \u00e7\u00f6zmek i\u00e7in daha zarif ve g\u00fc\u00e7l\u00fc y\u00f6ntemler sunar.<\/p>\n<h2>Promise'lerin Kurtar\u0131c\u0131 Rol\u00fc: Yemek Sipari\u015finizin Gelece\u011fine Dair Bir Taahh\u00fct<\/h2>\n<p>Callback cehenneminin getirdi\u011fi zorluklar, JavaScript toplulu\u011funu daha iyi bir \u00e7\u00f6z\u00fcm aramaya itti ve b\u00f6ylece Promise'ler (Vaatler) ortaya \u00e7\u0131kt\u0131. Promise'ler, gelecekte tamamlanacak veya ba\u015far\u0131s\u0131z olacak bir i\u015flemin nihai sonucunu temsil eden nesnelerdir. Onlar\u0131, bir yemek sipari\u015fi verdi\u011finizde size verilen bir \"taahh\u00fct\" veya \"sipari\u015f fi\u015fi\" gibi d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p><strong>Sipari\u015f Fi\u015finiz: Promise'in \u00dc\u00e7 Hali<\/strong><\/p>\n<p>Swiggy veya Zomato'dan bir sipari\u015f verdi\u011finizde, uygulama size hemen yeme\u011finizin masan\u0131za gelmesini sa\u011flamaz. Bunun yerine, bir \"sipari\u015f fi\u015fi\" verir (uygulamadaki sipari\u015f durumunuz gibi). Bu fi\u015fin \u00fc\u00e7 olas\u0131 durumu vard\u0131r:<\/p>\n<ol>\n<li><strong>Beklemede (Pending):<\/strong> Sipari\u015finiz mutfakta haz\u0131rlan\u0131yor. Hen\u00fcz tamamlanmad\u0131 veya iptal edilmedi. (<code>new Promise()<\/code> ile olu\u015fturulan ba\u015flang\u0131\u00e7 durumu).<\/li>\n<li><strong>Yerine Getirildi (Fulfilled\/Resolved):<\/strong> Yeme\u011finiz haz\u0131rland\u0131 ve teslim edildi. Her \u015fey yolunda gitti. (Promise'in ba\u015far\u0131l\u0131 bir \u015fekilde tamamlanmas\u0131).<\/li>\n<li><strong>Reddedildi (Rejected):<\/strong> Yeme\u011finiz haz\u0131rlanamad\u0131 veya sipari\u015finiz iptal edildi (\u00f6rne\u011fin, mutfakta malzeme kalmad\u0131). (Promise'in bir hatayla sonu\u00e7lanmas\u0131).<\/li>\n<\/ol>\n<p>Promise'ler sayesinde, bir asenkron i\u015flemin sonucunu hemen beklemek yerine, o i\u015flemin gelecekteki durumuna dair bir \"s\u00f6z\" alm\u0131\u015f olursunuz. Bu s\u00f6z\u00fcn yerine getirilmesini veya reddedilmesini takip edebilir, buna g\u00f6re hareket edebilirsiniz.<\/p>\n<p><strong>Promise'ler Nas\u0131l Kullan\u0131l\u0131r? Zincirleme ve Hata Y\u00f6netimi<\/strong><\/p>\n<p>Promise'ler, <code>.then()<\/code>, <code>.catch()<\/code> ve <code>.finally()<\/code> metodlar\u0131 arac\u0131l\u0131\u011f\u0131yla kullan\u0131l\u0131r. Bu metodlar, Promise'in durumuna g\u00f6re hangi kodun \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtmenizi sa\u011flar ve en \u00f6nemlisi, birbirlerine zincirlenebilirler, bu da callback cehennemini ortadan kald\u0131r\u0131r.<\/p>\n<ul>\n<li><code>.then(onFulfilled, onRejected)<\/code>: Promise ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda (<code>onFulfilled<\/code>) veya reddedildi\u011finde (<code>onRejected<\/code>) \u00e7al\u0131\u015facak fonksiyonlar\u0131 tan\u0131mlar. Genellikle <code>onRejected<\/code> i\u00e7in ayr\u0131 bir <code>.catch()<\/code> kullan\u0131l\u0131r.<\/li>\n<li><code>.catch(onRejected)<\/code>: Promise reddedildi\u011finde (bir hata olu\u015ftu\u011funda) \u00e7al\u0131\u015facak fonksiyonu tan\u0131mlar. Hata y\u00f6netimini merkezi hale getirir.<\/li>\n<li><code>.finally(onFinally)<\/code>: Promise'in durumu ne olursa olsun (ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z), her zaman \u00e7al\u0131\u015facak fonksiyonu tan\u0131mlar. Genellikle temizleme i\u015flemleri i\u00e7in kullan\u0131l\u0131r (\u00f6rne\u011fin, y\u00fckleme animasyonunu kapatmak).<\/li>\n<\/ul>\n<p>Callback cehennemi \u00f6rne\u011fini Promise'ler ile yeniden yazal\u0131m:<\/p>\n<pre><code>\nfunction restoranSecPromise() {\n  console.log(\"Restoranlar y\u00fckleniyor (Promise)...\");\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      const restoran = \"Burgerc\u00fc Baba\";\n      console.log(<code>${restoran} se\u00e7ildi.<\/code>);\n      resolve(restoran); \/\/ Ba\u015far\u0131l\u0131, restoran\u0131 geri d\u00f6nd\u00fcr\n    }, 1000);\n  });\n}\n\nfunction menuyuGetirPromise(restoran) {\n  console.log(<code>${restoran} men\u00fcs\u00fc y\u00fckleniyor (Promise)...<\/code>);\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      const menu = [\"Hamburger\", \"Patates\", \"Kola\"];\n      console.log(\"Men\u00fc y\u00fcklendi.\");\n      resolve(menu);\n    }, 1500);\n  });\n}\n\nfunction sepeteEklePromise(menu, urun) {\n  console.log(<code>${urun} sepete ekleniyor (Promise)...<\/code>);\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      if (menu.includes(urun)) {\n        console.log(<code>${urun} sepete eklendi.<\/code>);\n        resolve({ urun, miktar: 1 });\n      } else {\n        reject(<code>\u00dcr\u00fcn \"${urun}\" men\u00fcde yok!<\/code>); \/\/ Hata\n      }\n    }, 800);\n  });\n}\n\nfunction siparisiOnaylaPromise(sepet) {\n  console.log(\"Sipari\u015f onaylan\u0131yor (Promise)...\");\n  return new Promise((resolve, reject) => {\n    setTimeout(() => {\n      const siparisID = Math.floor(Math.random() * 10000);\n      console.log(<code>Sipari\u015finiz ${siparisID} ile onayland\u0131!<\/code>);\n      resolve(siparisID);\n    }, 2000);\n  });\n}\n\n\/\/ Promise zincirlemesi ile daha temiz kod:\nrestoranSecPromise()\n  .then(restoran => menuyuGetirPromise(restoran)) \/\/ Restoran se\u00e7ilince men\u00fcy\u00fc getir\n  .then(menu => Promise.all([ \/\/ Birden fazla \u00fcr\u00fcn\u00fc ayn\u0131 anda sepete ekle (ileride detayland\u0131r\u0131lacak)\n    sepeteEklePromise(menu, \"Hamburger\"),\n    sepeteEklePromise(menu, \"Patates\")\n  ]))\n  .then(sepetUrunleri => siparisiOnaylaPromise(sepetUrunleri)) \/\/ Sepet \u00fcr\u00fcnleri gelince sipari\u015fi onayla\n  .then(siparisID => console.log(<code>Mutlu son! Sipari\u015f ID: ${siparisID}<\/code>)) \/\/ Sipari\u015f onaylan\u0131nca ID'yi g\u00f6ster\n  .catch(error => console.error(\"Bir hata olu\u015ftu:\", error)) \/\/ Herhangi bir ad\u0131mda hata olursa yakala\n  .finally(() => console.log(\"Sipari\u015f ak\u0131\u015f\u0131 tamamland\u0131.\")); \/\/ Her durumda \u00e7al\u0131\u015f\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, Promise'lerle kod daha yatay ve okunabilir hale geldi. Her <code>.then()<\/code> blo\u011fu, bir \u00f6nceki Promise'in ba\u015far\u0131l\u0131 sonucunu al\u0131r ve bir sonraki asenkron i\u015flemi ba\u015flat\u0131r. Zincirin herhangi bir noktas\u0131nda bir hata olu\u015fursa, kontrol hemen en yak\u0131n <code>.catch()<\/code> blo\u011funa atlar, bu da hata y\u00f6netimini \u00e7ok daha kolay ve merkezi hale getirir. Art\u0131k, Swiggy'de bir sipari\u015fin birden fazla a\u015famadan ge\u00e7erken uygulaman\u0131n nas\u0131l bu kadar ak\u0131c\u0131 kald\u0131\u011f\u0131n\u0131 daha iyi anl\u0131yorsunuz. Promise'ler sayesinde her ad\u0131m bir sonrakine s\u00f6z vererek ilerler ve kullan\u0131c\u0131 deneyimi kesintisiz olur.<\/p>\n<h2>Async\/Await: Yemek Haz\u0131rlan\u0131rken Mutfakta Beklemek Gibi mi?<\/h2>\n<p>Promise'ler, callback cehennemine \u00f6nemli bir \u00e7\u00f6z\u00fcm getirmi\u015f olsa da, \u00f6zellikle uzun Promise zincirlerinde yine de okunabilirlik ve kodun ak\u0131\u015f\u0131 konusunda baz\u0131 zorluklar ya\u015fanabilirdi. \u0130\u015fte bu noktada JavaScript'e ECMAScript 2017 (ES8) ile eklenen <code>async\/await<\/code> anahtar kelimeleri devreye girdi. Async\/Await, Promise'ler \u00fczerine kurulu \"sentaktik bir \u015feker\" olup, asenkron kodu senkron kod gibi, \u00e7ok daha temiz ve okunakl\u0131 bir \u015fekilde yazmam\u0131z\u0131 sa\u011flar.<\/p>\n<p><strong>Mutfakta \"Bekleyen\" A\u015f\u00e7\u0131, \u00c7al\u0131\u015fan Restoran<\/strong><\/p>\n<p>Async\/Await'i anlamak i\u00e7in yine restoran analogisine d\u00f6nelim. A\u015f\u00e7\u0131 yeme\u011fi haz\u0131rlarken bazen belirli bir malzemenin haz\u0131r olmas\u0131n\u0131 beklemek zorundad\u0131r (\u00f6rne\u011fin, f\u0131r\u0131ndaki kekin pi\u015fmesini beklemek gibi). Bu \"bekleme\" (<code>await<\/code>) an\u0131nda a\u015f\u00e7\u0131 o anki g\u00f6revi i\u00e7in durur, ancak restoran\u0131n geri kalan\u0131 (garsonlar, di\u011fer a\u015f\u00e7\u0131lar) \u00e7al\u0131\u015fmaya devam eder. Yani, a\u015f\u00e7\u0131 belirli bir i\u015fi \"beklerken\" ana mutfak (JavaScript'in ana i\u015f par\u00e7ac\u0131\u011f\u0131) bloke olmaz, di\u011fer i\u015flere devam edebilir. Ancak, a\u015f\u00e7\u0131n\u0131n kendisi o an i\u00e7in \"bekleme\" durumundad\u0131r.<\/p>\n<p><strong><code>async<\/code> Fonksiyonlar ve <code>await<\/code> Anahtar Kelimesi<\/strong><\/p>\n<p><code>async<\/code> kelimesi bir fonksiyonun \u00f6n\u00fcne yaz\u0131ld\u0131\u011f\u0131nda, o fonksiyonun her zaman bir Promise d\u00f6nd\u00fcrece\u011fini belirtir. Bu fonksiyonun i\u00e7inde <code>await<\/code> anahtar kelimesini kullanabiliriz. <code>await<\/code> ise sadece <code>async<\/code> fonksiyonlar i\u00e7inde kullan\u0131labilir ve bir Promise'in tamamlanmas\u0131n\u0131 bekler. Promise yerine getirildi\u011finde (resolved), <code>await<\/code> bize Promise'in de\u011ferini d\u00f6nd\u00fcr\u00fcr; e\u011fer reddedilirse (rejected), bir hata f\u0131rlat\u0131r.<\/p>\n<pre><code>\n\/\/ Promise'leri d\u00f6nd\u00fcren fonksiyonlar\u0131m\u0131z zaten mevcut:\n\/\/ restoranSecPromise(), menuyuGetirPromise(), sepeteEklePromise(), siparisiOnaylaPromise()\n\nasync function siparisVerAsync() {\n  console.log(\"--- Async\/Await ile Sipari\u015f Verme ---\");\n  try {\n    const restoran = await restoranSecPromise(); \/\/ Restoran se\u00e7ilmesini bekle\n    const menu = await menuyuGetirPromise(restoran); \/\/ Men\u00fcn\u00fcn gelmesini bekle\n    \n    \/\/ Birden fazla \u00fcr\u00fcn\u00fc paralel olarak sepete ekle (Promise.all ile)\n    const sepetUrunleri = await Promise.all([\n      sepeteEklePromise(menu, \"Hamburger\"),\n      sepeteEklePromise(menu, \"Patates\")\n    ]);\n\n    const siparisID = await siparisiOnaylaPromise(sepetUrunleri); \/\/ Sipari\u015fin onaylanmas\u0131n\u0131 bekle\n    console.log(<code>Sonu\u00e7: Async\/Await ile sipari\u015f ID: ${siparisID}<\/code>);\n  } catch (error) {\n    console.error(\"Async\/Await hatas\u0131:\", error); \/\/ Hata yakalama\n  } finally {\n    console.log(\"Async\/Await sipari\u015f ak\u0131\u015f\u0131 tamamland\u0131.\");\n  }\n}\n\nsiparisVerAsync();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodu inceledi\u011fimizde, asenkron i\u015flemlerin sanki senkron bir \u015fekilde, ad\u0131m ad\u0131m yaz\u0131lm\u0131\u015f gibi g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc fark edeceksiniz. <code>await<\/code> sayesinde, bir Promise tamamlanana kadar kodun o sat\u0131rda \"duraklamas\u0131n\u0131\" sa\u011flayabiliriz. Ancak unutulmamal\u0131d\u0131r ki bu \"duraklama\", sadece <code>async<\/code> fonksiyonun kendi i\u00e7indeki y\u00fcr\u00fctmeyi durdurur, JavaScript'in ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke etmez. Ana i\u015f par\u00e7ac\u0131\u011f\u0131, <code>await<\/code> edilen Promise'in tamamlanmas\u0131n\u0131 beklerken di\u011fer i\u015fleri yapmaya devam eder. Promise \u00e7\u00f6z\u00fcmlendi\u011finde veya reddedildi\u011finde, <code>async<\/code> fonksiyon kald\u0131\u011f\u0131 yerden devam eder.<\/p>\n<p>Hata y\u00f6netimi <code>try...catch<\/code> bloklar\u0131 ile Promise'lerden bile daha tan\u0131d\u0131k ve anla\u015f\u0131l\u0131r bir \u015fekilde yap\u0131labilir, t\u0131pk\u0131 senkron kodlarda oldu\u011fu gibi. <code>.finally()<\/code> blo\u011fu da ayn\u0131 i\u015flevi g\u00f6r\u00fcr ve i\u015flem ba\u015far\u0131l\u0131 olsun ya da olmas\u0131n \u00e7al\u0131\u015f\u0131r.<\/p>\n<p><code>async\/await<\/code> kullan\u0131m\u0131, \u00f6zellikle Swiggy ve Zomato gibi karma\u015f\u0131k etkile\u015fimlerin oldu\u011fu uygulamalarda kodun bak\u0131m\u0131n\u0131, test edilebilirli\u011fini ve genel okunabilirli\u011fini muazzam derecede art\u0131r\u0131r. Restoran listesinin y\u00fcklenmesi, filtreleme uygulanmas\u0131, sipari\u015fin \u00f6deme a\u015famas\u0131na ge\u00e7ilmesi gibi bir\u00e7ok ad\u0131m\u0131n sorunsuz bir \u015fekilde birbirini takip etmesi, b\u00fcy\u00fck \u00f6l\u00e7\u00fcde bu modern asenkron programlama deseni sayesinde m\u00fcmk\u00fcn olmaktad\u0131r.<\/p>\n<p>K\u0131sacas\u0131, <code>async\/await<\/code> ile asenkronlu\u011fun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 soyutlayarak, adeta \"mutfakta bekliyormu\u015f gibi\" ama asl\u0131nda t\u00fcm restoran\u0131n ak\u0131\u015f\u0131n\u0131 bozmadan, ak\u0131c\u0131 bir kullan\u0131c\u0131 deneyimi sunmak art\u0131k \u00e7ok daha kolay.<\/p>\n<div class=\"interactive-tip\">\n  Uzman \u0130pucu: <code>async<\/code> fonksiyonlar her zaman bir Promise d\u00f6nd\u00fcr\u00fcr. E\u011fer <code>async<\/code> bir fonksiyon i\u00e7inde a\u00e7\u0131k\u00e7a bir de\u011fer d\u00f6nd\u00fcrmezseniz, varsay\u0131lan olarak <code>Promise.resolve(undefined)<\/code> d\u00f6nd\u00fcr\u00fcr. Bu, <code>async<\/code> fonksiyonlar\u0131 di\u011fer Promise tabanl\u0131 kodlarla kolayca entegre etmenizi sa\u011flar.\n<\/div>\n<h3>Performans Canavar\u0131: Swiggy ve Zomato Nas\u0131l Tak\u0131lmadan \u00c7al\u0131\u015f\u0131yor?<\/h3>\n<p>Swiggy, Zomato ve benzeri mobil odakl\u0131 platformlar\u0131n ba\u015far\u0131s\u0131n\u0131n anahtarlar\u0131ndan biri, kullan\u0131c\u0131ya sunduklar\u0131 kesintisiz ve h\u0131zl\u0131 deneyimdir. Asenkron JavaScript, bu ak\u0131c\u0131 deneyimin temelini olu\u015fturur. Peki, asenkronluk tam olarak nas\u0131l bir \"performans canavar\u0131\"na d\u00f6n\u00fc\u015f\u00fcyor ve mobil uygulamalardaki tak\u0131lmalar\u0131 nas\u0131l \u00f6nl\u00fcyor?<\/p>\n<p><strong>API \u00c7a\u011fr\u0131lar\u0131 ve Aray\u00fcz Ak\u0131c\u0131l\u0131\u011f\u0131<\/strong><\/p>\n<p>Bir yemek sipari\u015fi uygulamas\u0131nda, arka u\u00e7 sunucular\u0131ndan s\u00fcrekli olarak veri \u00e7ekilir: restoran listeleri, men\u00fcler, kullan\u0131c\u0131 yorumlar\u0131, teslimat b\u00f6lgeleri, promosyonlar ve daha fazlas\u0131. Bu veri \u00e7ekme i\u015flemleri (API \u00e7a\u011fr\u0131lar\u0131), a\u011f gecikmelerine tabidir ve genellikle birka\u00e7 y\u00fcz milisaniye hatta saniyeler s\u00fcrebilir. E\u011fer bu \u00e7a\u011fr\u0131lar senkron olsayd\u0131, her API iste\u011fi g\u00f6nderildi\u011finde uygulama tamamen donar, kullan\u0131c\u0131 ekranda hi\u00e7bir \u015fey yapamazd\u0131. Bu durum, mobil kullan\u0131c\u0131lar i\u00e7in kabul edilemez bir deneyim olurdu.<\/p>\n<p>Asenkron JavaScript sayesinde, uygulaman\u0131z bir restoran listesi i\u00e7in API \u00e7a\u011fr\u0131s\u0131 yapt\u0131\u011f\u0131nda, bu i\u015flem arka plana at\u0131l\u0131r ve ana i\u015f par\u00e7ac\u0131\u011f\u0131 serbest kal\u0131r. Bu, kullan\u0131c\u0131n\u0131n bu s\u00fcre\u00e7te men\u00fcler aras\u0131nda gezinebilece\u011fi, filtreleri ayarlayabilece\u011fi veya konumunu g\u00fcncelleyebilece\u011fi anlam\u0131na gelir. API'den veri geldi\u011finde, asenkron mekanizmalar sayesinde uygulama verileri i\u015fler ve kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc g\u00fcnceller, t\u00fcm bunlar kullan\u0131c\u0131n\u0131n hissedece\u011fi bir tak\u0131lma olmadan ger\u00e7ekle\u015fir.<\/p>\n<p><strong>G\u00f6rsel Y\u00fcklemeler ve Kullan\u0131c\u0131 Deneyimi<\/strong><\/p>\n<p>Swiggy ve Zomato, g\u00f6rselli\u011fe dayal\u0131 uygulamalard\u0131r. Restoran foto\u011fraflar\u0131, yemek g\u00f6rselleri, banner'lar gibi y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc bir\u00e7ok resim y\u00fcklenir. Bu resimlerin indirilmesi ve belle\u011fe y\u00fcklenmesi de zaman al\u0131c\u0131 asenkron bir i\u015flemdir. Asenkron y\u00fckleme sayesinde, resimler birer birer veya topluca arka planda indirilirken, kullan\u0131c\u0131n\u0131n ekranda di\u011fer i\u00e7erikleri g\u00f6rmesi veya uygulaman\u0131n geri kalan\u0131yla etkile\u015fim kurmas\u0131 engellenmez. Y\u00fcklenen resimler haz\u0131r olduk\u00e7a ekranda belirir, bu da kullan\u0131c\u0131n\u0131n uygulaman\u0131n \"canl\u0131\" ve tepkisel oldu\u011fu hissini g\u00fc\u00e7lendirir.<\/p>\n<p><strong>Mobil Uyumlu Tasar\u0131m ve Performans<\/strong><\/p>\n<p>Mobil cihazlar, farkl\u0131 ekran boyutlar\u0131na ve a\u011f ko\u015fullar\u0131na sahiptir. Asenkron JS, bu farkl\u0131l\u0131klar\u0131 y\u00f6netmeye yard\u0131mc\u0131 olur. \u00d6rne\u011fin, d\u00fc\u015f\u00fck bant geni\u015fli\u011fine sahip bir kullan\u0131c\u0131 i\u00e7in resimlerin daha d\u00fc\u015f\u00fck kalitede y\u00fcklenmesi veya verilerin daha k\u00fc\u00e7\u00fck paketler halinde al\u0131nmas\u0131 gibi stratejiler asenkron i\u015flemlerle entegre edilebilir. Ayr\u0131ca, aray\u00fcz\u00fcn mobil cihazlarda d\u00fczg\u00fcn g\u00f6r\u00fcnmesi i\u00e7in HTML ve CSS'in duyarl\u0131 olmas\u0131 gerekir. Asenkron i\u015flemler aray\u00fcz\u00fcn ak\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flarken, duyarl\u0131 tasar\u0131m da g\u00f6r\u00fcn\u00fcm\u00fcn do\u011fru olmas\u0131n\u0131 garantiler.<\/p>\n<pre><code>\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mobil Yemek Uygulamas\u0131<\/title>\n    <style>\n        body { font-family: sans-serif; margin: 0; padding: 0; background-color: #f8f8f8; }\n        .container {\n            width: 90%;\n            margin: 20px auto;\n            background-color: #fff;\n            padding: 20px;\n            border-radius: 8px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        .restaurant-card {\n            border: 1px solid #eee;\n            border-radius: 5px;\n            margin-bottom: 15px;\n            padding: 10px;\n            display: flex;\n            align-items: center;\n            opacity: 0; \/* Ba\u015flang\u0131\u00e7ta gizli *\/\n            transform: translateY(20px); \/* Ba\u015flang\u0131\u00e7ta hafif\u00e7e a\u015fa\u011f\u0131da *\/\n            transition: opacity 0.5s ease-out, transform 0.5s ease-out; \/* Animasyon ekle *\/\n        }\n        .restaurant-card.loaded {\n            opacity: 1; \/* Y\u00fcklendi\u011finde g\u00f6r\u00fcn\u00fcr *\/\n            transform: translateY(0); \/* Pozisyonuna gel *\/\n        }\n        .restaurant-card img {\n            width: 80px;\n            height: 80px;\n            border-radius: 4px;\n            margin-right: 15px;\n            object-fit: cover;\n        }\n        .restaurant-info h3 { margin: 0 0 5px 0; color: #333; }\n        .restaurant-info p { margin: 0; color: #777; font-size: 0.9em; }\n\n        \/* Mobil Cihazlar i\u00e7in Medya Sorgusu *\/\n        @media (max-width: 768px) {\n            .container {\n                width: 95%;\n                margin: 10px auto;\n                padding: 15px;\n            }\n            .restaurant-card {\n                flex-direction: column;\n                text-align: center;\n            }\n            .restaurant-card img {\n                margin: 0 0 10px 0;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h2>Yak\u0131ndaki Restoranlar<\/h2>\n        <div id=\"restaurant-list\">\n            <!-- Restoran kartlar\u0131 buraya y\u00fcklenecek -->\n        <\/div>\n    <\/div>\n\n    <script>\n        async function fetchRestaurants() {\n            const restaurantListDiv = document.getElementById('restaurant-list');\n            \/\/ Y\u00fckleme g\u00f6stergesi eklenebilir\n            restaurantListDiv.innerHTML = '<p>Restoranlar y\u00fckleniyor...<\/p>';\n\n            try {\n                \/\/ Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131 yerine gecikmeli veri sim\u00fclasyonu\n                const response = await new Promise(resolve => setTimeout(() => {\n                    resolve([\n                        { id: 1, name: \"Lezzet K\u00f6\u015fk\u00fc\", rating: 4.5, cuisine: \"T\u00fcrk Mutfa\u011f\u0131\", image: \"https:\/\/picsum.photos\/id\/1018\/80\/80\" },\n                        { id: 2, name: \"Pizza Diyar\u0131\", rating: 4.2, cuisine: \"\u0130talyan\", image: \"https:\/\/picsum.photos\/id\/1025\/80\/80\" },\n                        { id: 3, name: \"Uzakdo\u011fu Tad\u0131\", rating: 4.8, cuisine: \"\u00c7in & Japon\", image: \"https:\/\/picsum.photos\/id\/1033\/80\/80\" },\n                        { id: 4, name: \"Burger D\u00fcnyas\u0131\", rating: 4.0, cuisine: \"Fast Food\", image: \"https:\/\/picsum.photos\/id\/1039\/80\/80\" }\n                    ]);\n                }, 2000)); \/\/ 2 saniye gecikme\n\n                restaurantListDiv.innerHTML = ''; \/\/ Y\u00fckleme g\u00f6stergesini temizle\n\n                response.forEach(restaurant => {\n                    const card = document.createElement('div');\n                    card.className = 'restaurant-card';\n                    card.innerHTML = <code><img decoding=\"async\" src=\"${restaurant.image}\" alt=\"${restaurant.name}\" onerror=\"this.src=&#039;https:\/\/via.placeholder.com\/80?text=Yemek&#039;\">\n                        <div class=\"restaurant-info\">\n                            <h3>${restaurant.name}<\/h3>\n                            <p>${restaurant.cuisine} \u2022 ${restaurant.rating} <span style=\"color: gold;\">\u2605<\/span><\/p>\n                        <\/div><\/code>;\n                    restaurantListDiv.appendChild(card);\n                    \/\/ Kart y\u00fcklendikten sonra animasyonu ba\u015flat\n                    setTimeout(() => card.classList.add('loaded'), 50); \n                });\n            } catch (error) {\n                console.error(\"Restoranlar y\u00fcklenirken hata olu\u015ftu:\", error);\n                restaurantListDiv.innerHTML = '<p>Restoranlar y\u00fcklenemedi. L\u00fctfen daha sonra tekrar deneyin.<\/p>';\n            }\n        }\n\n        document.addEventListener('DOMContentLoaded', fetchRestaurants);\n    <\/script>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki HTML ve JavaScript kodunda, <code>fetchRestaurants<\/code> fonksiyonu asenkron olarak restoran verilerini \u00e7ekiyor. Bu i\u015flem s\u0131ras\u0131nda kullan\u0131c\u0131 \"Restoranlar y\u00fckleniyor...\" mesaj\u0131n\u0131 g\u00f6r\u00fcr. Veriler geldi\u011finde, her bir restoran kart\u0131 dinamik olarak olu\u015fturulur ve hafif bir animasyonla ekrana eklenir. Bu, kullan\u0131c\u0131n\u0131n uygulaman\u0131n yan\u0131t verdi\u011fini hissetmesini sa\u011flar ve t\u00fcm liste y\u00fcklenene kadar donmas\u0131n\u0131 engeller. CSS'deki <code>@media<\/code> sorgusu ise mobil cihazlarda kartlar\u0131n dikey hizalanmas\u0131n\u0131 sa\u011flayarak duyarl\u0131 bir tasar\u0131m \u00f6rne\u011fi sunar.<\/p>\n<p>Sonu\u00e7 olarak, asenkron JavaScript, modern Swiggy ve Zomato gibi uygulamalar\u0131n h\u0131zl\u0131, ak\u0131c\u0131 ve kullan\u0131c\u0131 dostu olmas\u0131n\u0131n temel ta\u015f\u0131d\u0131r. Arka planda karma\u015f\u0131k veri i\u015flemlerini y\u00f6netirken bile, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc her zaman tepkisel tutarak \u00fcst\u00fcn bir kullan\u0131c\u0131 deneyimi sunar.<\/p>\n<h3>Daha Ak\u0131ll\u0131 Asenkron Y\u00f6netim: Birden \u00c7ok Sipari\u015fi Ayn\u0131 Anda Nas\u0131l \u0130dare Edersiniz?<\/h3>\n<p>Modern uygulamalarda sadece tek bir asenkron i\u015flemi y\u00f6netmek yeterli de\u011fildir. Genellikle birden fazla asenkron i\u015flemin ayn\u0131 anda ba\u015flat\u0131lmas\u0131, bunlar\u0131n sonu\u00e7lar\u0131n\u0131n beklenmesi veya belirli bir ko\u015fulun ger\u00e7ekle\u015fmesi durumunda harekete ge\u00e7ilmesi gerekir. JavaScript'in Promise API'si, bu t\u00fcr senaryolar i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar: <code>Promise.all()<\/code> ve <code>Promise.race()<\/code>.<\/p>\n<p><strong><code>Promise.all()<\/code>: T\u00fcm Yemeklerin Ayn\u0131 Anda Haz\u0131r Olmas\u0131n\u0131 Beklemek<\/strong><\/p>\n<p>Bir aile yeme\u011fi sipari\u015fi verdi\u011finizi d\u00fc\u015f\u00fcn\u00fcn. Masadaki herkesin yeme\u011fi ayn\u0131 anda gelirse en iyi deneyim ya\u015fan\u0131r. Hi\u00e7 kimse kendi yeme\u011fi gelmeden di\u011ferlerini beklemek veya yeme\u011fi so\u011fumu\u015fken di\u011ferlerinin gelmesini seyretmek istemez. \u0130\u015fte <code>Promise.all()<\/code> tam da bu senaryoya kar\u015f\u0131l\u0131k gelir. Bir dizi Promise'i al\u0131r ve bu Promise'lerin <strong>t\u00fcm\u00fc<\/strong> ba\u015far\u0131l\u0131 bir \u015fekilde tamamlanana kadar bekler. T\u00fcm Promise'ler yerine getirildi\u011finde, <code>Promise.all()<\/code> kendi sonucunu, Promise'lerin sonu\u00e7lar\u0131n\u0131n bir dizisi olarak d\u00f6nd\u00fcr\u00fcr (Promise dizisindeki s\u0131rayla). E\u011fer Promise'lerden herhangi biri reddedilirse, <code>Promise.all()<\/code> hemen reddedilir ve ilk reddedilen Promise'in hatas\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong>Kullan\u0131m Alan\u0131:<\/strong><\/p>\n<ul>\n<li>Bir sayfa y\u00fcklenmeden \u00f6nce birden fazla API'den veri \u00e7ekmek (\u00f6rne\u011fin, kullan\u0131c\u0131 profili, bildirimler ve ayarlar).<\/li>\n<li>Birden fazla g\u00f6rseli ayn\u0131 anda y\u00fcklemek ve t\u00fcm\u00fc haz\u0131r oldu\u011funda g\u00f6stermek.<\/li>\n<li>Swiggy'de bir sipari\u015fin farkl\u0131 a\u015famalar\u0131n\u0131 ayn\u0131 anda kontrol etmek (\u00f6rne\u011fin, restoran onay\u0131, a\u015f\u00e7\u0131 onay\u0131, kurye atamas\u0131).<\/li>\n<\/ul>\n<pre><code>\n\/\/ Promise'leri d\u00f6nd\u00fcren \u00f6rnek fonksiyonlar\u0131m\u0131z:\n\/\/ restoranSecPromise(), menuyuGetirPromise(), sepeteEklePromise(), siparisiOnaylaPromise()\n\nasync function topluSiparisVer() {\n  console.log(\"--- Promise.all ile Toplu Sipari\u015f ---\");\n  try {\n    const restoran = await restoranSecPromise();\n    const menu = await menuyuGetirPromise(restoran);\n\n    console.log(\"Birden fazla \u00fcr\u00fcn\u00fc sepete paralel ekliyorum...\");\n    const [hamburger, patates, kola] = await Promise.all([\n      sepeteEklePromise(menu, \"Hamburger\"),\n      sepeteEklePromise(menu, \"Patates\"),\n      sepeteEklePromise(menu, \"Kola\")\n    ]);\n\n    console.log(\"T\u00fcm \u00fcr\u00fcnler sepete eklendi:\", [hamburger, patates, kola]);\n    const siparisID = await siparisiOnaylaPromise([hamburger, patates, kola]);\n    console.log(<code>Toplu sipari\u015finiz ba\u015far\u0131yla olu\u015fturuldu! ID: ${siparisID}<\/code>);\n\n  } catch (error) {\n    console.error(\"Toplu sipari\u015f s\u0131ras\u0131nda hata:\", error);\n  }\n}\n\ntopluSiparisVer();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>sepeteEklePromise<\/code> \u00e7a\u011fr\u0131lar\u0131 <code>Promise.all()<\/code> i\u00e7ine al\u0131nd\u0131\u011f\u0131 i\u00e7in, bu \u00fc\u00e7 i\u015flem (Hamburger, Patates, Kola ekleme) e\u015f zamanl\u0131 olarak ba\u015flar ve hepsi tamamland\u0131\u011f\u0131nda bir sonraki ad\u0131ma (<code>siparisiOnaylaPromise<\/code>) ge\u00e7ilir. Bu, toplam bekleme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p><strong><code>Promise.race()<\/code>: En H\u0131zl\u0131 Haz\u0131r Olan Yeme\u011fi Yemek<\/strong><\/p>\n<p>Bazen birden fazla asenkron i\u015flem ba\u015flat\u0131r\u0131z ama sadece ilk tamamlanan sonuca ihtiyac\u0131m\u0131z vard\u0131r. \u00d6rne\u011fin, ayn\u0131 bilgiyi farkl\u0131 sunuculardan \u00e7ekmeye \u00e7al\u0131\u015f\u0131rken, hangi sunucunun daha h\u0131zl\u0131 yan\u0131t verdi\u011fini \u00f6\u011frenmek isteyebiliriz. Ya da bir yemek uygulamas\u0131nda, birden fazla restorandan ayn\u0131 yeme\u011fi sipari\u015f etti\u011fimizi ve hangisinin ilk olarak sipari\u015fi onaylad\u0131\u011f\u0131n\u0131 bilmek istedi\u011fimizi d\u00fc\u015f\u00fcnelim. \u0130\u015fte bu senaryoda <code>Promise.race()<\/code> devreye girer. Bir dizi Promise al\u0131r ve bu Promise'lerden <strong>ilk tamamlanan (ba\u015far\u0131l\u0131 ya da ba\u015far\u0131s\u0131z)<\/strong> Promise'in sonucunu d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong>Kullan\u0131m Alan\u0131:<\/strong><\/p>\n<ul>\n<li>Birden fazla API'den veri \u00e7ekmeye \u00e7al\u0131\u015f\u0131rken en h\u0131zl\u0131 yan\u0131t vereni kullanmak.<\/li>\n<li>Bir i\u015flemin belirli bir s\u00fcre i\u00e7inde tamamlan\u0131p tamamlanmad\u0131\u011f\u0131n\u0131 kontrol etmek (timeout eklemek).<\/li>\n<li>Birden fazla kaynaktan gelen verilerden en g\u00fcncel olan\u0131 almak.<\/li>\n<\/ul>\n<pre><code>\nasync function enHizliServis() {\n  console.log(\"--- Promise.race ile En H\u0131zl\u0131 Servis ---\");\n\n  \/\/ Farkl\u0131 restoranlardan ayn\u0131 yeme\u011fi sipari\u015f etti\u011fimizi varsayal\u0131m\n  const siparis1 = new Promise(resolve => setTimeout(() => resolve(\"Restoran A: Pizza haz\u0131r!\"), 3000)); \/\/ 3 saniye\n  const siparis2 = new Promise(resolve => setTimeout(() => resolve(\"Restoran B: Pizza haz\u0131r!\"), 1500)); \/\/ 1.5 saniye\n  const siparis3 = new Promise(resolve => setTimeout(() => resolve(\"Restoran C: Pizza haz\u0131r!\"), 2000)); \/\/ 2 saniye\n\n  try {\n    const ilkGelen = await Promise.race([siparis1, siparis2, siparis3]);\n    console.log(<code>\u0130lk gelen servis: ${ilkGelen}<\/code>);\n  } catch (error) {\n    console.error(\"Servislerde hata:\", error);\n  }\n}\n\nenHizliServis();\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Promise.race()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, \u00fc\u00e7 Promise de ayn\u0131 anda ba\u015flar. <code>siparis2<\/code> en k\u0131sa s\u00fcrede (1.5 saniye) tamamland\u0131\u011f\u0131 i\u00e7in, <code>ilkGelen<\/code> de\u011fi\u015fkenine onun sonucu atan\u0131r ve di\u011fer Promise'lerin sonu\u00e7lar\u0131 art\u0131k \u00f6nemsiz hale gelir.<\/p>\n<p>Hem <code>Promise.all()<\/code> hem de <code>Promise.race()<\/code>, \u00f6zellikle Swiggy ve Zomato gibi birden fazla veri kayna\u011f\u0131n\u0131 veya i\u015flemi ayn\u0131 anda y\u00f6netmesi gereken karma\u015f\u0131k uygulamalarda, asenkron kodu daha verimli ve anlaml\u0131 hale getiren g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. Bu sayede uygulamalar, birden fazla i\u015flemi paralel olarak y\u00fcr\u00fcterek genel performans\u0131 art\u0131rabilir ve kullan\u0131c\u0131lara daha h\u0131zl\u0131 geri bildirim sa\u011flayabilir.<\/p>\n<h2>Sonu\u00e7: Asenkron JavaScript ile Ak\u0131c\u0131 Bir Deneyim M\u00fcmk\u00fcn m\u00fc?<\/h2>\n<p>Geli\u015ftirdi\u011fimiz her web veya mobil uygulama i\u00e7in kullan\u0131c\u0131 deneyimi kritik \u00f6neme sahiptir. Swiggy, Zomato ve benzeri platformlar, kullan\u0131c\u0131lar\u0131n parmaklar\u0131n\u0131n ucunda anl\u0131k geri bildirim ve kesintisiz bir ak\u0131\u015f bekledi\u011fi dijital \u00e7a\u011fda bu beklentiyi fazlas\u0131yla kar\u015f\u0131l\u0131yor. \u0130\u015fte bu ak\u0131c\u0131 deneyimin arkas\u0131nda yatan sihirli de\u011fnek, asenkron JavaScript'in g\u00fcc\u00fcd\u00fcr.<\/p>\n<p>Bu makalede, senkronizasyonun blokaj yaratan do\u011fas\u0131ndan ba\u015flay\u0131p, callback fonksiyonlar\u0131n\u0131n getirdi\u011fi ilk asenkron \u00e7\u00f6z\u00fcm\u00fc ve onun zorluklar\u0131 olan \"callback cehennemini\" inceledik. Ard\u0131ndan, Promise'lerin bu zorluklar\u0131 nas\u0131l ele ald\u0131\u011f\u0131n\u0131 ve asenkron kodumuzu daha y\u00f6netilebilir hale getirdi\u011fini g\u00f6rd\u00fck. Son olarak, <code>async\/await<\/code> ile asenkron programlaman\u0131n ne kadar temiz, okunakl\u0131 ve senkron bir ak\u0131\u015fta yaz\u0131labildi\u011fini ke\u015ffettik.<\/p>\n<p>Swiggy'den bir sipari\u015f verirken restoranlar\u0131n listelenmesi, men\u00fcn\u00fcn y\u00fcklenmesi, \u00fcr\u00fcnlerin sepete eklenmesi ve \u00f6deme i\u015fleminin tamamlanmas\u0131 gibi her ad\u0131m\u0131n, kullan\u0131c\u0131n\u0131n hi\u00e7bir zaman bir donma ya\u015famadan ger\u00e7ekle\u015fmesi, JavaScript'in Event Loop'u ve Promise\/Async-Await gibi asenkron mekanizmalar\u0131n\u0131n ustaca kullan\u0131m\u0131 sayesinde m\u00fcmk\u00fcn olmaktad\u0131r. <code>Promise.all()<\/code> ve <code>Promise.race()<\/code> gibi geli\u015fmi\u015f teknikler ise birden fazla asenkron i\u015flemin daha ak\u0131ll\u0131ca y\u00f6netilmesini sa\u011flayarak performans\u0131 daha da art\u0131r\u0131r.<\/p>\n<p>Modern bir geli\u015ftirici olarak, asenkron JavaScript'i anlamak ve etkili bir \u015fekilde kullanmak art\u0131k bir se\u00e7enek de\u011fil, bir zorunluluktur. Bu beceri seti, hem kullan\u0131c\u0131lar\u0131n beklentilerini kar\u015f\u0131layan hem de geli\u015ftiriciler i\u00e7in daha s\u00fcrd\u00fcr\u00fclebilir kod tabanlar\u0131 olu\u015fturan uygulamalar in\u015fa etmenizi sa\u011flayacakt\u0131r. Unutmay\u0131n, kodunuzun mutfa\u011f\u0131 ne kadar iyi organize edilirse, servisiniz de o kadar h\u0131zl\u0131 ve kusursuz olacakt\u0131r!<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<h3>Async\/await neden Promise'lerden daha iyi kabul edilir?<\/h3>\n<p><code>async\/await<\/code>, asl\u0131nda Promise'ler \u00fczerine in\u015fa edilmi\u015f sentaktik bir \u015fekerdir. Bu da demek oluyor ki, <code>async\/await<\/code>'in yapt\u0131\u011f\u0131 her \u015fey Promise'lerle de yap\u0131labilir. Ancak, <code>async\/await<\/code> kodu senkron kod gibi daha d\u00fcz bir yap\u0131da yazman\u0131za olanak tan\u0131r, bu da onu \u00f6zellikle karma\u015f\u0131k ve zincirleme asenkron i\u015flemler i\u00e7in \u00e7ok daha okunakl\u0131, anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 kolay hale getirir. Hata y\u00f6netimi de <code>try...catch<\/code> bloklar\u0131yla senkron kodlara benzer bir \u015fekilde yap\u0131labildi\u011fi i\u00e7in daha tan\u0131d\u0131kt\u0131r.<\/p>\n<h3>JavaScript neden tek i\u015f par\u00e7ac\u0131kl\u0131 (single-threaded) bir dil olarak tasarlanm\u0131\u015ft\u0131r?<\/h3>\n<p>JavaScript ba\u015flang\u0131\u00e7ta web taray\u0131c\u0131lar\u0131nda DOM (Belge Nesne Modeli) manip\u00fclasyonu i\u00e7in tasarlanm\u0131\u015ft\u0131r. E\u011fer birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131 ayn\u0131 DOM \u00f6\u011fesini ayn\u0131 anda de\u011fi\u015ftirmeye \u00e7al\u0131\u015fsayd\u0131, bu tutars\u0131zl\u0131klara ve karma\u015f\u0131k e\u015fzamanl\u0131l\u0131k sorunlar\u0131na yol a\u00e7abilirdi. Tek i\u015f par\u00e7ac\u0131kl\u0131 bir yap\u0131, bu t\u00fcr karma\u015f\u0131kl\u0131klar\u0131 \u00f6nleyerek geli\u015ftiricilerin i\u015fini kolayla\u015ft\u0131rm\u0131\u015ft\u0131r. Asenkron mekanizmalar (Event Loop, Callback Queue vb.) sayesinde, tek i\u015f par\u00e7ac\u0131kl\u0131 olmas\u0131na ra\u011fmen bloklama yapmadan e\u015f zamans\u0131z g\u00f6revleri ba\u015far\u0131yla y\u00f6netebilir.<\/p>\n<h3>Asenkron kodda hata y\u00f6netimi nas\u0131l yap\u0131l\u0131r?<\/h3>\n<p>Callback'lerde hata y\u00f6netimi genellikle callback fonksiyonuna ilk parametre olarak bir <code>Error<\/code> nesnesi g\u00f6ndermek (Node.js stilinde <code>(err, data) => {...}<\/code>) ve her ad\u0131mda kontrol etmekle yap\u0131l\u0131r. Promise'lerde ise hatalar <code>.catch()<\/code> metodu ile merkezi olarak yakalan\u0131r. <code>async\/await<\/code> kullan\u0131rken, hata y\u00f6netimi en kolay ve anla\u015f\u0131l\u0131r \u015fekilde <code>try...catch<\/code> bloklar\u0131 ile yap\u0131l\u0131r, t\u0131pk\u0131 senkron kodlarda oldu\u011fu gibi.<\/p>\n<h3>JavaScript Event Loop nedir ve asenkronlu\u011fu nas\u0131l sa\u011flar?<\/h3>\n<p>Event Loop, JavaScript'in tek i\u015f par\u00e7ac\u0131kl\u0131 do\u011fas\u0131na ra\u011fmen asenkron i\u015flemleri y\u00f6netmesini sa\u011flayan temel bir mekanizmad\u0131r. Ana i\u015f par\u00e7ac\u0131\u011f\u0131 (Call Stack), senkron kodlar\u0131 y\u00fcr\u00fct\u00fcr. Asenkron bir i\u015flem (\u00f6rne\u011fin, bir a\u011f iste\u011fi veya <code>setTimeout<\/code>) ba\u015flat\u0131ld\u0131\u011f\u0131nda, bu i\u015flem arka plana (Web API'leri, Node.js API'leri gibi) g\u00f6nderilir. Arka plandaki i\u015flem tamamland\u0131\u011f\u0131nda, bir \"callback\" veya \"Promise \u00e7\u00f6z\u00fcm\u00fc\" g\u00f6revi, bir kuyru\u011fa (Callback Queue veya Microtask Queue) eklenir. Event Loop s\u00fcrekli olarak Call Stack'i kontrol eder; e\u011fer bo\u015fsa, kuyruklardan bir sonraki g\u00f6revi al\u0131r ve Call Stack'e iter, b\u00f6ylece bu g\u00f6rev ana i\u015f par\u00e7ac\u0131\u011f\u0131nda y\u00fcr\u00fct\u00fclebilir.<\/p>\n<h3>Callback'lerin dezavantajlar\u0131 callback hell ile mi s\u0131n\u0131rl\u0131d\u0131r?<\/h3>\n<p>Callback hell (i\u00e7 i\u00e7e ge\u00e7mi\u015f callback'ler) callback'lerin en bilinen dezavantaj\u0131 olsa da, ba\u015fka sorunlar\u0131 da vard\u0131r:<\/p>\n<ol>\n<li><strong>Hata Y\u00f6netimi Zorlu\u011fu:<\/strong> Hatalar, callback zincirinin her seviyesinde ayr\u0131 ayr\u0131 ele al\u0131nmas\u0131 gerekti\u011finden karma\u015f\u0131kla\u015f\u0131r.<\/li>\n<li><strong>Inversion of Control (Kontrol\u00fcn Tersine D\u00f6nmesi):<\/strong> Bir fonksiyonun, parametre olarak ald\u0131\u011f\u0131 callback'i ne zaman ve ka\u00e7 kez \u00e7a\u011f\u0131raca\u011f\u0131n\u0131 kontrol edememesi durumudur. Bu, beklenmedik davran\u0131\u015flara yol a\u00e7abilir.<\/li>\n<li><strong>Okunabilirlik ve Bak\u0131m Zorlu\u011fu:<\/strong> Kodun derinli\u011fi artt\u0131k\u00e7a anla\u015f\u0131lmas\u0131 ve hatalar\u0131n ay\u0131klanmas\u0131 g\u00fc\u00e7le\u015fir.<\/li>\n<\/ol>\n<p>Promise'ler ve <code>async\/await<\/code> bu sorunlar\u0131n \u00e7o\u011funa daha zarif ve y\u00f6netilebilir \u00e7\u00f6z\u00fcmler sunar.<\/p>\n","protected":false},"excerpt":{"rendered":"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n&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-34386","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>Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m<\/title>\n<meta name=\"description\" content=\"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?\" \/>\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\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m\" \/>\n<meta property=\"og:description\" content=\"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-15T23:31:10+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m\",\"datePublished\":\"2025-11-15T23:31:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\"},\"wordCount\":4239,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\",\"name\":\"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-15T23:31:10+00:00\",\"description\":\"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m\"}]},{\"@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":"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m","description":"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?","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\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/","og_locale":"tr_TR","og_type":"article","og_title":"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m","og_description":"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?","og_url":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-15T23:31:10+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m","datePublished":"2025-11-15T23:31:10+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/"},"wordCount":4239,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/","url":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/","name":"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-15T23:31:10+00:00","description":"Modern web ve mobil uygulamalar\u0131n kalbinde yatan asenkron JavaScript kavram\u0131, Swiggy veya Zomato gibi pop\u00fcler yemek sipari\u015fi platformlar\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan temel mekanizmalardan biridir. Bir yeme\u011fi sipari\u015f ederken uygulaman\u0131n donup kalmamas\u0131n\u0131, arka planda farkl\u0131 i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcrken bile kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kalmas\u0131n\u0131 sa\u011flayan bu b\u00fcy\u00fcl\u00fc d\u00fcnyay\u0131 ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/async-js-swiggy-zomato-ve-yemek-siparisleri-ile-adim-adim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Async JS: Swiggy, Zomato ve Yemek Sipari\u015fleri ile Ad\u0131m Ad\u0131m"}]},{"@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\/34386","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=34386"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34386\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}