Promise kelimesini vaat olarak Türkçe’ye çevirebiliriz. Gerçek hayatta olduğu gibi bir vaat verilir ve sonuç olarak ya gerçekleşir ya da gerçekleşmez. Promise, eşzamansız (asenkron) bir işlemin sonunda tamamlandığını (gerçekleşme) veya hatayı (gerçekleşmeme) temsil eden bir nesnedir. Klasik bir callback işleminin döngüye girdiğinde çok büyük sorun yaratacağını açıktır. Promise, klasik callback mekanizmasıyla fonksiyonları aktarmak yerine dönen nesnelere yeni callback ekleme imkanı sunar.
Bir promise, klasik callback tersine bazı garantiler sunar:
- JavaScript olay döngüsünün (event loop) mevcut çalışmasının tamamlanmasından önce callback asla aranmaz.
- Asenkron işlemin başarılı veya başarısız olmasından sonra then() ile eklenen callback’ler çağrılabilir.
- then() birden fazla defa eklenebilir. Her callback diğerinden sonra çalışır.
1 2 3 4 5 6 |
setTimeout(function() { console.log('Promise: 1') setTimeout(function() { console.log('Promise: 2') }, 1000) }, 1000) |
Bir önceki arrow ve promise konusunu kullanarak bu kodu şöyle de yazabiliriz.
1 2 3 4 5 6 7 8 9 10 |
//Promise nesnesi üzerinden çözüm const bekle = () => new Promise((resolve, reject) => { setTimeout(resolve, 1000) }) bekle().then(() => { console.log('Promise 1') return bekle() }) .then(() => console.log('Promise 2')) |
bekle içine yeni bir Promise nesnesi tanımladık. Burada resolve başarılı bir fonksiyon için şartı alırken reject başarısız bir durumu temsil eder. Bu bir şarta göre ayarlanabilir. Yukarıdaki kodda her halikarda resolve bir durum söz konusudur. then başarılı durumlar için kullanılırken reject varsa catch kullanılır. Yukarıdaki örnekte then bittikten sonra yine then gelir. Kod bekle() ile 1 sn bekler. return bekle() bir saniye daha bekletmek için kullanılmıştır.
İki then ifadesinin arda arda kullanılması Javascript zincirleme (chaining) olduğunu gösterir. (Birçok dilde bu özellik gelmeye başladı.)
Bu bölümde konuyu kısaca anlattım. Daha fazla bilgi için tıklayın.
ES7 ile birlikte Async/Await özellikleri de Javascript diline eklenmiştir. Asenkron programlamaya hakim kişiler Javascript’in çok iyi özellikler kazandığını fark etmiştir. Daha fazla bilgi için tıklayın.