Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] async/await ile Asenkron Kod Yazma
Herkese merhaba, bugun modern JavaScript'in belki de en sevdigim ozelligini anlatacagim: async/await. ES2017 ile gelen bu syntax, asenkron kodu sanki senkronmus gibi yazmamizi sagliyor. Promise'lerin uzerine insa edilen bir syntactic sugar ama kodun okunakliligini inanilmaz derecede artiriyor. Ben async/await'i ogrendikten sonra eski kodlarima bakip "bu ne bicim kod" dedim ve hepsini refactor ettim.
async ve await Nedir?
async kelimesi bir fonksiyonun basina konulur ve o fonksiyonun her zaman bir Promise dondurdugunu belirtir. Fonksiyondan dondurdugunuz deger otomatik olarak Promise.resolve ile sarilir. Eger fonksiyon hata firlatirsa, Promise.reject ile sarilir. await kelimesi ise sadece async fonksiyonlarin icinde kullanilabilir ve bir Promise'in resolve olmasini bekler. await kullandiginizda, JavaScript o noktada durur (ama event loop'u bloklamaz) ve Promise sonuclandiginda devam eder.
Bunu gundelik hayattan bir ornekle anlatayim: online yemek siparis veriyorsunuz. await dediginiz an siparisinizi verdiniz ve bekliyorsunuz. Ama siz beklerken bilgisayarinizda baska isler yapabiliyorsunuz. Yemek gelince kaldigniz yerden devam ediyorsunuz. Iste async/await tam olarak boyle calisiyor.
JavaScript:
// async fonksiyon tanimlama
async function selamVer() {
return 'Merhaba!';
}
// Yukaridaki asagidakiyle ayni
function selamVerPromise() {
return Promise.resolve('Merhaba!');
}
// Her ikisi de ayni sekilde kullanilir
selamVer().then(mesaj => console.log(mesaj));
// await kullanimi
async function kullaniciIslemleri() {
console.log('1. Kullanici aranıyor...');
// await ile Promise'in sonucunu bekliyoruz
const kullanici = await kullaniciBul(1);
console.log('2. Kullanici bulundu:', kullanici.ad);
const siparisler = await siparisleriGetir(kullanici.id);
console.log('3. Siparisler:', siparisler.length, 'adet');
return { kullanici, siparisler };
}
// Yardimci fonksiyonlar
function kullaniciBul(id) {
return new Promise(resolve => {
setTimeout(() => resolve({ id, ad: 'Ahmet', email: 'ahmet@test.com' }), 100);
});
}
function siparisleriGetir(kullaniciId) {
return new Promise(resolve => {
setTimeout(() => resolve([
{ id: 1, urun: 'Laptop', tutar: 15000 },
{ id: 2, urun: 'Mouse', tutar: 250 }
]), 100);
});
}
// Calistirma
kullaniciIslemleri()
.then(sonuc => console.log('Tum islemler tamam:', sonuc))
.catch(hata => console.error('Hata:', hata.message));
async/await ile Dosya Islemleri
Node.js'te async/await'in en yaygin kullanim alani dosya islemleri ve veritabani sorgularidir. fs/promises modulu ile birlikte kullanildiginda, dosya islemleri cok temiz ve okunakli hale geliyor.
JavaScript:
const fs = require('fs/promises');
const path = require('path');
// Config yukleyici
async function configYukle(ortam) {
const configDosyasi = path.join(__dirname, 'config', `${ortam}.json`);
try {
const icerik = await fs.readFile(configDosyasi, 'utf8');
const config = JSON.parse(icerik);
console.log(`${ortam} konfigurasyonu yuklendi`);
return config;
} catch (error) {
if (error.code === 'ENOENT') {
console.warn(`${ortam}.json bulunamadi, varsayilan kullaniliyor`);
return { port: 3000, debug: false };
}
throw error;
}
}
// Proje scaffolder
async function projeOlustur(projeAdi) {
const temelYol = path.join(__dirname, projeAdi);
// Klasor yapisi
const klasorler = ['src', 'src/routes', 'src/models', 'tests', 'public'];
for (const klasor of klasorler) {
await fs.mkdir(path.join(temelYol, klasor), { recursive: true });
console.log(` Olusturuldu: ${klasor}/`);
}
// package.json olustur
const packageJson = {
name: projeAdi,
version: '1.0.0',
main: 'src/index.js',
scripts: {
start: 'node src/index.js',
dev: 'nodemon src/index.js',
test: 'jest'
}
};
await fs.writeFile(
path.join(temelYol, 'package.json'),
JSON.stringify(packageJson, null, 2)
);
// index.js olustur
const indexJs = `const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({ mesaj: '${projeAdi} calisiyor!' });
});
app.listen(PORT, () => {
console.log('Sunucu ${PORT} portunda calisiyor');
});`;
await fs.writeFile(path.join(temelYol, 'src', 'index.js'), indexJs);
console.log(`\n${projeAdi} projesi olusturuldu!`);
}
// Paralel islemler - await ile Promise.all birlikte
async function topluDosyaIslemi() {
const dosyalar = ['data1.json', 'data2.json', 'data3.json'];
// YANLIS: Sirayla okuma (yavas)
// for (const dosya of dosyalar) {
// const icerik = await fs.readFile(dosya);
// }
// DOGRU: Paralel okuma (hizli)
const sonuclar = await Promise.all(
dosyalar.map(dosya => fs.readFile(dosya, 'utf8').catch(() => null))
);
return sonuclar.filter(s => s !== null);
}
// Top-level await (ES modules ile)
// import fs from 'fs/promises';
// const config = await fs.readFile('config.json', 'utf8');
Sik Yapilan Hatalar
async/await kullanirken en cok yapilan hata, gereksiz yere sirayla beklemektir. Iki bagimsiz islem varsa, ikisini de await ile sirayla cagirmak yerine Promise.all ile paralel calistirmalisiniz. Bu cok yaygin bir performans kaybina yol acar ve ben code review'larda bunu surekli duzeltiyorum.
Bir diger onemli hata, forEach icinde await kullanmaktir. forEach async callback'leri beklemez, o yuzden for...of dongusu kullanmalisiniz. forEach ile yazdığinızda kodunuz calismis gibi gorünür ama aslinda islemler paralel ve kontrolsuz calisir.
Son olarak, await kullanmayi unutmak en sinsi hatadir. Bir async fonksiyonu await'siz cagirirsiniz, hicbir hata almadan calismis gibi gorunur ama aslinda Promise'i beklememissinizdir. Linter'lar bu konuda yardimci olabiliyor, @typescript-eslint/no-floating-promises kuralini aktif edin. Bir sonraki konuda async/await ile hata yonetimini detayli inceleyecegiz!
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 1
- Görüntüleme
- 36
- Cevaplar
- 9
- Görüntüleme
- 473
Altın Konu
Next.js'de API Oluşturma Ve Kullanma
- Cevaplar
- 12
- Görüntüleme
- 1K
