Best Studio 1
Best Studio
TuZaKK 1
TuZaKK
Mt2Hizmet 1
Mt2Hizmet
Agora Metin2 1
Agora Metin2
Bvural41 1
Bvural41
kaptanmikro1 1
kaptanmikro1
R 1
Roksam
[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
farkmt2official 1
farkmt2official
emirhanHCL 1
emirhanHCL
Hikaye Ekle

[NODE JS] async/await ile Asenkron Kod Yazma

  • Konuyu başlatan Konuyu başlatan Silverhand
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 1
  • Görüntüleme Görüntüleme 14

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!

nodejs.png


[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!
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst