emirhanHCL 1
emirhanHCL
farkmt2official 1
farkmt2official
mannaxxx 1
mannaxxx
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Best Studio 1
Best Studio
Hikaye Ekle

[NODE JS] Callback Nedir? Callback Pattern Anlatimi

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

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] Callback Nedir? Callback Pattern Anlatimi​


Merhaba arkadaslar, bugun Node.js'in temel taslarindan biri olan callback kavramini ve callback pattern'ini derinlemesine inceleyecegiz. Callback'ler Node.js'in asenkron dogasinin temeli ve bunlari anlamadan Node.js'te verimli kod yazmak mumkun degil. Ben ilk Node.js ogrendigimde callback mantigi kafami cok karistirmisti cunku daha once sadece senkron diller kullanmistim. Ama bir kere oturduktan sonra her sey daha anlamli olmaya basladi.

Callback Nedir?​


Callback en basit tanimiyla, baska bir fonksiyona parametre olarak gecirilen ve belirli bir islem tamamlandiginda cagrilan fonksiyondur. Yani bir fonksiyona "su isi yap, bittiginde beni ara" diyorsunuz. Gercek hayattan bir ornek verelim: restorana yemek siparis veriyorsunuz, garson numaranizi aliyor ve yemek hazir oldugunda sizi cagiriyor. Burada garsonun sizi geri aramasi bir callback'tir.

JavaScript'te fonksiyonlar "first-class citizen" yani birinci sinif vatandaslardir. Bu ne demek? Fonksiyonlari degiskenlere atayabilir, diger fonksiyonlara parametre olarak gecebilir ve fonksiyonlardan dondürebilirsiniz. Iste callback pattern'i bu ozellige dayanir.

JavaScript:
// Callback'in en basit hali
function selamVer(isim, callback) {
    console.log(`Merhaba ${isim}!`);
    callback();
}

selamVer('Ahmet', function() {
    console.log('Selamlama tamamlandi');
});

// Arrow function ile daha temiz
selamVer('Mehmet', () => {
    console.log('Bu da arrow function callback');
});

// Parametre alan callback
function hesapla(a, b, islem) {
    const sonuc = islem(a, b);
    console.log(`Sonuc: ${sonuc}`);
}

hesapla(10, 5, (x, y) => x + y);  // Toplama
hesapla(10, 5, (x, y) => x * y);  // Carpma
hesapla(10, 5, (x, y) => x - y);  // Cikarma

// Asenkron callback ornegi
console.log('1. islem');

setTimeout(() => {
    console.log('2. islem (1 saniye sonra)');
}, 1000);

console.log('3. islem (ama 2. islemden once calisir!)');

Node.js Error-First Callback Pattern​


Node.js'te bir konvansiyon vardir: callback fonksiyonlarinin ilk parametresi her zaman error nesnesidir. Buna "error-first callback" veya "Node.js callback convention" denir. Islem basarili olursa error null olur ve ikinci parametrede sonuc gelir. Hata olursa error bir Error nesnesi olur. Bu konvansiyon sayesinde tum Node.js ekosisteminde tutarli bir hata yonetimi yapilabilir.

Bu pattern'i kullanirken en onemli kural, her zaman ilk once error'u kontrol etmektir. Cok fazla yeni baslayanin bu kontrolu atladigini goruyorum ve sonra neden kodlarinin sessizce basarisiz oldugunu anlayamiyorlar. Error kontrolu yapmak ilk basta gereksiz gibi gorunebilir ama production'da hayat kurtaricidir.

JavaScript:
const fs = require('fs');
const path = require('path');

// Node.js error-first callback pattern
// Kural: Ilk parametre HER ZAMAN error

// Ornek 1: Dosya okuma (Node.js'in kendi API'si)
fs.readFile(path.join(__dirname, 'config.json'), 'utf8', (error, data) => {
    if (error) {
        // Hata var, islem basarisiz
        console.error('Dosya okunamadi:', error.message);
        return; // ONEMLI: return ile fonksiyondan cik
    }

    // Hata yok, islem basarili
    console.log('Dosya icerigi:', data);
});

// Ornek 2: Kendi fonksiyonumuzu yazalim
function kullaniciBul(id, callback) {
    // Veritabanini simule edelim
    const kullanicilar = {
        1: { ad: 'Ahmet', yas: 28 },
        2: { ad: 'Ayse', yas: 32 },
        3: { ad: 'Fatma', yas: 25 }
    };

    // Asenkron islemi simule et
    setTimeout(() => {
        const kullanici = kullanicilar[id];

        if (!kullanici) {
            // Hata durumu: error nesnesini gonder
            callback(new Error(`Kullanici #${id} bulunamadi`), null);
            return;
        }

        // Basari durumu: error null, sonuc ikinci parametre
        callback(null, kullanici);
    }, 100);
}

// Kullanim
kullaniciBul(1, (error, kullanici) => {
    if (error) {
        console.error('Hata:', error.message);
        return;
    }
    console.log('Bulunan kullanici:', kullanici);
});

kullaniciBul(99, (error, kullanici) => {
    if (error) {
        console.error('Hata:', error.message);
        return;
    }
    console.log('Bulunan kullanici:', kullanici);
});

// Ornek 3: Zincirleme callback islemleri
function dosyaOkuVeIsle(dosyaYolu, callback) {
    fs.readFile(dosyaYolu, 'utf8', (readError, icerik) => {
        if (readError) {
            callback(readError, null);
            return;
        }

        // Icerigi isle
        try {
            const veri = JSON.parse(icerik);
            veri.okunanZaman = new Date().toISOString();
            callback(null, veri);
        } catch (parseError) {
            callback(parseError, null);
        }
    });
}

// Kendi async fonksiyonunuzu her zaman error-first pattern ile yazin
function veritabanSorgusu(sorgu, parametreler, callback) {
    // Parametre dogrulama
    if (!sorgu || typeof sorgu !== 'string') {
        // Senkron hatalar icin process.nextTick kullanin
        process.nextTick(() => {
            callback(new Error('Sorgu string olmalidir'), null);
        });
        return;
    }

    // Asenkron islem
    setTimeout(() => {
        try {
            const sonuc = { satirlar: [], etkilenen: 0 };
            callback(null, sonuc);
        } catch (error) {
            callback(error, null);
        }
    }, 50);
}

Callback Kullanirken Yapilan Hatalar​


Yillar icinde gordugun en yaygin callback hatalari sunlar: Birincisi, error kontrolunu atlama. Ikincisi, callback'i birden fazla kez cagirma, bu ozellikle if/else bloklarinda return kullanmayi unutunca olur. Ucuncusu, senkron hatalari try/catch yerine callback ile gondermemek. Dorduncusu, callback icinde exception firlatmak (throw). Node.js callback'leri icinde throw kullanirsaniz, ust fonksiyon bunu yakalayamaz cunku callback asenkron calisir.

Benim tavsiyem, yeni projelerde mumkun oldukca Promise ve async/await kullanmaniz yonunde. Ama eski kodlarla calisirken veya bazi Node.js core API'lerini kullanirken callback'lerle karsilasacaksiniz. O yuzden bu pattern'i iyi anlamak sart. Bir sonraki konumuz callback hell, onu da okumadan gecmeyin!
 

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

Geri
Üst