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] Promise Nedir? Nasil Olusturulur?

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

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] Promise Nedir? Nasil Olusturulur?​


Merhaba arkadaslar, bugun JavaScript'in en onemli kavramlarindan biri olan Promise'i bastan sona anlatacagim. Promise, asenkron islemlerin sonucunu temsil eden bir nesnedir. "Soz veriyorum, bu islem bitince sonucunu sana bildirecem" gibi dusunebilirsiniz. Ben Promise'leri ilk ogrendigimde "niye buna ihtiyac var ki, callback var iste" demistim ama zamanla ne kadar guclu bir araç oldugunu anladim.

Promise'in Uc Durumu​


Bir Promise uc durumdan birinde olabilir. Pending (beklemede): islem henuz tamamlanmadi. Fulfilled (basarili): islem basariyla tamamlandi ve bir sonuc dondurdu. Rejected (basarisiz): islem hatayla sonuclandi. Bir Promise olusturuldugunda pending durumundadir ve ya fulfilled ya da rejected durumuna gecer. Bu gecis tek seferlik ve geri donusuzdur, yani bir kere resolved veya rejected olduktan sonra durumu degismez.

Bu tek seferlik gecis ozelligi cok onemli. Callback'lerde yanlilikla callback'i iki kere cagirabileceginizi hatirlayin. Promise'lerde bu mumkun degildir, resolve veya reject sadece ilk cagrildiginda etkili olur, sonraki cagrilar sessizce yok sayilir.

JavaScript:
// Promise olusturma - temel syntax
const benimPromise = new Promise((resolve, reject) => {
    // Asenkron islem burada yapilir
    const basarili = true;

    if (basarili) {
        resolve('Islem basarili!'); // fulfilled durumuna gecer
    } else {
        reject(new Error('Islem basarisiz!')); // rejected durumuna gecer
    }
});

// Promise kullanimi
benimPromise
    .then(sonuc => {
        console.log('Basari:', sonuc);
    })
    .catch(hata => {
        console.error('Hata:', hata.message);
    });

// Gercek bir ornek: Gecikme fonksiyonu
function bekle(ms) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(`${ms}ms beklendi`);
        }, ms);
    });
}

bekle(1000).then(mesaj => console.log(mesaj));

// Gercek bir ornek: Veritabani simulasyonu
function kullaniciBul(id) {
    return new Promise((resolve, reject) => {
        // Veritabani sorgusunu simule et
        setTimeout(() => {
            const kullanicilar = {
                1: { id: 1, ad: 'Ahmet', email: 'ahmet@ornek.com' },
                2: { id: 2, ad: 'Ayse', email: 'ayse@ornek.com' },
                3: { id: 3, ad: 'Mehmet', email: 'mehmet@ornek.com' }
            };

            const kullanici = kullanicilar[id];

            if (kullanici) {
                resolve(kullanici);
            } else {
                reject(new Error(`Kullanici #${id} bulunamadi`));
            }
        }, 200);
    });
}

// Kullanim
kullaniciBul(1)
    .then(kullanici => {
        console.log('Kullanici bulundu:', kullanici.ad);
    })
    .catch(hata => {
        console.error(hata.message);
    });

kullaniciBul(99)
    .then(kullanici => {
        console.log('Bu calismamaliy:', kullanici);
    })
    .catch(hata => {
        console.error('Beklenen hata:', hata.message);
    });

Promise ile Callback Karsilastirmasi​


Neden callback yerine Promise kullanmaliyiz? Birincisi, hata yonetimi merkezilesiyor. Callback'lerde her seviyede ayri error kontrolu yapmaniz gerekir. Promise'lerde zincirin sonuna tek bir catch koyarsaniz, herhangi bir adimda olusan hata oraya duser. Ikincisi, zincirleme islemler cok daha okunakli. Ucuncusu, birden fazla asenkron islemi koordine etmek (Promise.all, Promise.race gibi) cok kolay.

JavaScript:
// Callback'i Promise'e cevirme - wrapper yazma
const fs = require('fs');

// Manuel wrapper
function dosyaOku(yol) {
    return new Promise((resolve, reject) => {
        fs.readFile(yol, 'utf8', (error, data) => {
            if (error) {
                reject(error);
            } else {
                resolve(data);
            }
        });
    });
}

// util.promisify ile otomatik wrapper
const { promisify } = require('util');
const dosyaOkuOtomatik = promisify(fs.readFile);

// Her ikisi de ayni sekilde kullanilir
dosyaOku('package.json')
    .then(icerik => console.log('Manuel wrapper:', icerik.length, 'karakter'))
    .catch(err => console.error(err.message));

dosyaOkuOtomatik('package.json', 'utf8')
    .then(icerik => console.log('Otomatik wrapper:', icerik.length, 'karakter'))
    .catch(err => console.error(err.message));

// Promise olusturmanin kisa yollari
// Hemen resolve olan Promise
const hemenBiten = Promise.resolve('aninda sonuc');
hemenBiten.then(s => console.log(s));

// Hemen reject olan Promise
const hemenHata = Promise.reject(new Error('aninda hata'));
hemenHata.catch(h => console.error(h.message));

// Kosullu Promise
function veriAl(onbellekKullan) {
    if (onbellekKullan) {
        // Senkron veri, ama Promise olarak sar
        return Promise.resolve({ kaynak: 'onbellek', veri: 'cachelenmis veri' });
    }

    // Asenkron veri
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve({ kaynak: 'sunucu', veri: 'taze veri' });
        }, 500);
    });
}

veriAl(true).then(s => console.log('Onbellek:', s));
veriAl(false).then(s => console.log('Sunucu:', s));

Dikkat Edilmesi Gerekenler​


Promise kullanirken dikkat etmeniz gereken birkac nokta var. Birincisi, her zaman catch ekleyin. Yakalanmayan Promise rejection'lari Node.js 15 ve sonrasinda uygulamanizi cokertiyor. Ikincisi, Promise constructor icinde asenkron islem yapiyorsaniz ve exception firlabilecek bir kod varsa try/catch kullanin cunku constructor icindeki exception otomatik olarak reject'e donusmez. Ucuncusu, Promise icinde resolve veya reject'ten sonra kod calismaya devam eder, o yuzden return kullanmayi unutmayin.

Tecrubeme gore en yaygin hata, then icinde yeni bir Promise dondurup onu yakalamamaktir. Her then bir Promise dondurur ve eger bu then'lerin icinde reject olabilecek islemler varsa, catch bu hatalari yakalar. Ama then disinda kalan catch'siz Promise'ler sessizce fail olur. Neyse, bir sonraki konuda Promise chaining'i detayli inceleyecegiz!
 

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

Geri
Üst