Nodejs'te asenkron işlemler için sıklıkla kullanılan Promise, Reject ve Resolve yapıları ile işlemlerin hatalı veya başarılı bir şekilde sonuçlandırılması mümkün hale gelir Reject, hatalı sonuçlandırmalar için kullanılırken, Resolve başarılı sonuçlandırmaları temsil eder Promise chaining ise birden fazla Promise'in ardışık olarak çalıştırılmasını sağlayarak, asenkron işlemlerin yönetimini kolaylaştırır Bu yapılar Nodejs platformunda özellikle kullanışlıdır ve web uygulamalarının geliştirme sürecinde önemli bir yer tutar
Node.js ile web uygulamaları geliştirme sürecinde, sıklıkla asenkron işlemler yönetilir. Bu işlemler, birçok farklı senaryoya bağlı olarak başarılı veya hatalı sonuçlandırılabilir. İşte tam da bu noktada, Promise yapısı devreye girer ve işlemleri kontrol etmek için bize çözümler sunar.
Bu makalede, Node.js'te Reject ve Resolve yapısının nasıl kullanıldığını öğreneceksiniz. Promise zincirleri ile olumsuz ve olumlu senaryolarda kullanılan Reject ve Resolve, web uygulamalarının geliştirme sürecinde oldukça önemli bir yer tutar.
Promise Nedir?
Promise, asenkron işlemlerle uğraşırken, işlemin başarı durumunu kontrol etmek için kullanılan bir yapıdır. Asenkron işlemlerin birden fazla aşamadan oluşan zincirinin sonunda bir sonuca ulaşması gerektiğinde, Promise kullanılır.
Promise, özellikle Node.js gibi platformlarda kullanışlıdır. Çünkü Node.js, işlemci kaynaklarına göre hızlı bir şekilde işlem yaparken, birçok farklı aşamadan oluşan işlemlerde işlemi yavaşlatıcı bir etkiye sahip olabilir. Bu durumda, Promise zinciri ile işlemler paralel olarak yürütülebilir ve sonuçların istenilen sırayla yönetilmesi sağlanabilir.
Reject ve Resolve Nedir?
Promise, asenkron işlemleri yönetmek için kullanılan bir yapıdır. Bu yapıda, işlem sırasında hatalı veya başarılı sonuçlandırmalar için kullanılan iki önemli kavram bulunur: Reject ve Resolve. Reject, bir Promise'in hatalı sonuçlandığını belirtirken, Resolve ise başarılı bir sonuçlandırmayı temsil eder.
Reject ile olumsuz senaryolarda hata mesajı döndürülürken, Resolve ile olumlu senaryolarda işlem sonucu döndürülür. Promise zincirinin sonunda kullanılan bu kavramlar, işlemin hatalı veya başarılı sonuçlandığını kontrol etmek için kullanılır. Eğer işlem başarılı sonuçlanmazsa, Reject içinde tanımlanan hata mesajı döndürülür. Öte yandan, işlem başarılı sonuçlanırsa, Resolve ile sonuçlar döndürülür.
Reject ve Resolve Nasıl Kullanılır?
Reject ve Resolve, Promise zincirinin sonunda kullanılan önemli yapılandırmalardır. Bunlar, Promise'in olumsuz veya olumlu sonuçlandığını belirlemek için kullanılır.
Eğer bir Promise zinciri içinde bir hata oluştuysa, Reject kullanarak hata mesajı döndürülebilir. Bu, özellikle asenkron işlemlerde hatanın tespit edilip mesajlaşılması için oldukça kullanışlıdır.
Buna karşılık, bir işlemin başarılı bir şekilde tamamlandığını belirtmek için Resolve kullanılır. Veri çekme, form gönderme gibi işlemlerde Resolve ile işlemin sonucu döndürülür ve bir sonraki Promise'e gönderilir.
Reject ve Resolve, Promise zincirinin en sonunda kullanılan yapılandırmalardır. Bu sayede, Promise zincirindeki işlemlerden herhangi birinde oluşan bir hatayı tespit edebilir ve mesajlaşabilir veya istenilen sonucu elde edebilirsiniz.
Reject Kullanımı
Reject, bir Promise'in hatalı sonuçlandığını belirtmek için kullanılır. Olumsuz senaryolarda, Reject kullanarak hata mesajı döndürülebilir. Bir API'den veri çekerken, API'de bir hata alındığında Reject kullanılabilir. Bu, hataların kontrol altında tutulmasına ve kullanıcıya anlamlı bir hata mesajı döndürülmesine yardımcı olur.
Bir örnek kullanım, bir HTTP isteği yaparken kullanılabilir. İstek başarılı değilse, Reject kullanarak bir hata mesajı döndürülebilir. Ayrıca, bir dosya işleme hatası veya veritabanı hatası alındığında da Reject kullanılabilir.
Resolve Kullanımı
Resolve, Promise yapılarında olumlu sonuçlanan senaryolarda kullanılır. Bu durumda, işlem sonucu döndürülür ve son kullanıcıya görüntülenir. Örneğin, bir kullanıcının hesabına bir bakiye yükleme işlemi yapıldığını varsayalım. Bu işlem başarılı bir şekilde tamamlandığında, Resolve kullanarak bu işlemin sonucu bakiye miktarı olarak döndürülebilir. Bu işlemin hatasız bir şekilde sonuçlanmasına olanak sağlar ve son kullanıcının işlem sonucunu takip etmesini kolaylaştırır.
Resolve kullanımında, döndürülecek verinin tipleri farklı olabilir. Örneğin, bir dizideki en büyük sayıyı bulmak amacıyla Promise kullanılırsa, Resolve ile bu sayı döndürülebilir. Ayrıca, veri tabanına yapılan bir işlem sonucu döndürülen kaydın ID değerinin döndürülmesi de Resolve ile gerçekleştirilebilir.
Promise Chaining
Promise chaining, birden fazla Promise'in ardışık olarak çalıştırılması anlamına gelir. Bu, her bir Promise'in diğerinden önce sonuçlanmasını beklemek yerine, diğer Promise'in sonuçlarını bekler. Bu şekilde, bir Promisenin sonuçları tarafından tetiklenen ikinci bir Promise zinciri oluşturmak mümkündür. Bu, birden fazla asenkron işlemin sonuçlarının gerektiği gibi koordine edilmesini sağlar, böylece istenilen sonuçlar elde edilir.
Promise chaining, Promise'in ardışık olarak çalışmasını sağlayan then(), catch() gibi metodlar aracılığıyla gerçekleştirilir. Bir Promise'in sonucu, ardışık olarak çalıştırılacak diğer Promise'e aktarılabilir. Bu sayede, bir zincirde n adet Promise çalıştırılabilir.
Örneğin, bir API'den veri çekmek istendiğinde, ilk Promise API'ye istek gönderir ve sonrasında gelen sonuçlar bir sonraki Promise tarafından işlenir. Bu şekilde, gelen sonuçlar bir zincir halinde işlenir ve sonuç istenilen şekilde elde edilir.
Gelen Sonuç | İşleme | Yönlendirme |
---|---|---|
Başarı durumu | İşlem sonucunu Resolve ile döndürür | Bir sonraki Promise'e yönlendirir |
Hata durumu | Hata mesajını Reject ile döndürür | Yakalanan hatayı ileten son Promise'e yönlendirir |
Promise chaining, Node.js'te Reject ve Resolve kullanarak asenkron işlemleri yönetmek için oldukça önemlidir. Birden fazla işlem sırasıyla yapılabilir ve sonuçların elde edilmesi için birbirine bağımlı olan işlemler bir zincirde takip edilebilir. Bu, asenkron işlemleri yönetirken daha düzenli ve verimli kod yazmayı sağlar.
Örnek Kod
Bir örnek kod ile Reject ve Resolve kullanımını daha sağlam bir şekilde anlayabiliriz. Aşağıdaki örnek kod bir API'den veri çekerek Reject ve Resolve kullanımını göstermektedir. Bu kod, node-fetch kütüphanesi kullanılarak yazılmıştır ve bir API isteği atılarak sonuçları Promise ile beklenmektedir.
Kod |
---|
|
Kodda bir API isteği atılır ve sonuçları beklemek için Promise kullanılır. Eğer sonuç başarılıysa, yani status kodu 200 ise, Resolve ile sonuçlar döndürülür. Eğer başarısız olursa, yani status kodu 200'ün dışında ise, Reject kullanarak hata mesajı döndürülür.
Bu örnek kod, Promise zincirinin sonuna Reject ve Resolve kullanılarak hatanın veya başarının kontrol edildiği bir örnek sunmaktadır. Promise zincirinin sona erdiği yerde hatalar Reject ile, başarılar ise Resolve ile yönetilmektedir.
Kod Açıklaması
Bu örnek kodda, fetch ile bir API isteği atılarak sonuçları Promise ile beklenmektedir. fetch metodu, sunucu tarafındaki bir veri kaynağına GET isteği gönderir ve Promise döndürür. Promise chain'in ilk bağlantısı then ile başlar, API yanıtı olan Response nesnesi kullanılarak işlem devam eder. Eğer yanıt başarılıysa, 200 OK alındığında sonraki bir bağlantı daha çağrılır. Bu bağlantıda json() metodu kullanılarak, JSON içeriği bir Promise ile döndürülür. Yine bir then bağlantısı daha kullanarak, JSON içeriği işlenir ve sonuçlar diğer Promise zincirine aktarılır. Ancak, eğer yanıt alınmadıysa ya da yanıt 200 OK değilse Promise zinciri, catch bloğunda belirtilen hata mesajını döndürür.
Bu şekilde kullanılan Reject ve Resolve, Promise zincirinin sonunda kullanılmaktadır. Böylece, işlemin başarılılığı veya başarısızlığı kontrol edilerek, sonuçlar doğru bir şekilde işlenebilir. Bu örnek kodda, Promise zinciri sonucunda verilen console.log, Resolve veya Reject durumuna göre sonuçları belirtir. Ayrıca, hata durumlarında catch kullanarak belirtilen hata mesajları ile kullanıcılara hata detayları sunulabilir.
```javascriptBu örnekte, fetch() fonksiyonu kullanılarak alınan veriler Promise ile yönetilmektedir. İlk olarak API isteği atılır ve gelen yanıtın durumu kontrol edilir. Eğer yanıt 200 değilse, yani hatalıysa, Reject ile bir hata döndürülür. Aksi takdirde, başarılı bir şekilde sonuçlandığına inanılan veri Resolve ile döndürülür. Bu örnek, bir API'den veri çeken basit bir uygulama olsa da, Node.js'te Reject ve Resolve kullanarak daha karmaşık uygulamalar geliştirmek mümkündür.
const fetchBir API isteğinde bulunmak için fetch işlevini kullanmak oldukça yaygındır. Node.js'te de bu işlev kullanılabilir. Ancak bunun için öncelikle node-fetch modülü yüklenmelidir. Daha sonra const fetch = require('node-fetch'); kodu kullanılarak fetch fonksiyonu çağrılabilir.
Bu işlev, parametre olarak API'nin URL'sini alır ve Promise döndürür. Bu promise, API yanıtı alındığında sonuç döndürür. Ayrıca promise zincirinde Reject ve Resolve kullanılarak istenilen sonuçlar elde edilebilir.
function getData() {Function getData()
getData() fonksiyonu, API'den veri alarak başarılı veya hatalı sonuç kontrolünü yapıp ilgili mesajları döndürür. Bu fonksiyon, bir Promise zinciri olarak tasarlanmıştır. İlk olarak, fetch() fonksiyonu kullanılarak ilgili API'ye istek atılır ve sonuçları Promise ile beklenir.
İkinci adımda, gelen yanıtın durumu kontrol edilir. Eğer yanıtın durumu 200 değilse, yani bir hata varsa, Reject kullanılarak bir hata mesajı döndürülür.
Eğer yanıt başarılı bir şekilde alındıysa, sonuçlar JSON formatında data değişkenine atanır ve Resolve ile bu sonuçlar döndürülür. Eğer bir hata olursa, sonuçlar yerine hatanın mesajı görüntülenir.
Bu şekilde, Promise zincirleri kullanarak veri işleme işlemleri daha kontrol edilebilir bir şekilde gerçekleştirilir. Ayrıca, Promise chaining ile de birden fazla işlem ardışık olarak gerçekleştirilebilir, bu da programların daha tutarlı ve doğru çalışmasını sağlar.
return fetch('https://jsonplaceholder.typicode.com/todos/1')Bu örnek kodda, Node.js kullanarak bir API'den veri çekmenin nasıl yapılacağı gösterilmektedir. fetch()
metodunu kullanarak, belirtilen API adresine bir GET isteği gönderilir. İşlemin sonucunda dönen cevap, ilk olarak "if" bloğunda kontrol edilir. Eğer cevabın durumu "200" değilse, yani bir hata ile karşılaşıldıysa, throw new Error()
metodu ile bir hata mesajı döndürülür. Eğer cevap başarılı bir şekilde geri döndürülürse, json()
metodu ile veriler alınır ve sonuçlar return
anahtarı ile geri döndürülür. Son olarak, catch()
metodu ile oluşabilecek hatalar yakalanır ve hata mesajı konsola yazdırılır.
.then(res => {'da, API'nin yanıtı değerlendirilmektedir. Eğer yanıt 200 (OK) değilse, Reject kullanarak bir hata mesajı döndürülebilir. Aksi takdirde, Resolve kullanarak veri dönülebilir. Bu örnekte, Promise'in ardışık kullanımı, yani Promise chaining kullanılmıştır. İlk Promise API isteğini yaparken, ikinci Promise sonucu verileri işleyip döndürmektedir. Bu, verilerin API'den alındıktan sonra hızlıca işlenmesine olanak sağlar.
if (res.status !Eğer kodda "if (res.status !== 200)" şartı sağlanırsa, API isteği başarısız olmuş demektir. Bu durumda "throw new Error('API Hatası')" satırı çalışarak bize bir hata mesajı döndürecektir. Böylece Reject kullanılarak olumsuz senaryolarda hata mesajı döndürmek mümkündür.
throw new Error('API Hatası');Bu satır, API'de bir hata oluştuğunda tetiklenir ve Error nesnesiyle birlikte hata mesajı döndürür. Örneğin, API'ye erişimde bir ağ sorunu oluşursa veya API'de belirtilen endpoint hatalıysa, Reject çağrısıyla birlikte bu hata mesajı kullanıcılara gösterilir.
Bu sayede, kullanıcılar API hataları hakkında bilgilendirilir ve gerekli adımlar atılabilir. API hataları, uygulamanın güvenliği ve performansı için önemlidir ve doğru şekilde yönetilmelidir. Node.js'de kullanılan Reject ve Error gibi yapılar, bu hataların doğru şekilde yönetilmesine yardımcı olur ve uygulamanın daha sağlam hale gelmesini sağlar.
}Bu örnek kodda, getData()
fonksiyonu kullanılarak bir API isteği atılır. İstek sonucu Return edilir. Eğer Return edilen sonuç başarılı ise, .then()
kullanarak sonuçlar Resolve edilir. Eğer başarısız ise, .catch()
kullanarak hata mesajı Reject edilir. Bu örnek kod, Reject ve Resolve kullanımını kullanarak asenkron işlemleri yönetmek için iyi bir örnek sunmaktadır.
Bu kısımda, API'den başarılı bir cevap alındıktan sonra geri döndürülecek olan verinin belirlenmesi işlemi gerçekleştirilir. JSON formatındaki cevap, res.json()
fonksiyonu ile bir Promise olarak geri döndürülür. Bu Promise, sonraki then()
bloğunda değer olarak kullanılacaktır.
Bu kodda, sonuçlar başarılıysa bir Resolve zinciri oluşturulmuştur. Eğer sonuç başarısız olursa, Catch zinciri çalışacaktır.
.then(dataBu adımda, API'den gelen veriler Resolve ile işlenmektedir. Eğer API'den gelen veriler başarılıysa, then() içerisindeki fonksiyon çalışır ve verileri işler. Aşağıdaki tabloda, .then() kullanımı hakkında daha detaylı bilgi bulabilirsiniz:
.then() | Açıklama |
---|---|
data | Promise'in sonucu olarak dönen verileri işlemek için kullanılır. |
return | İşlenmiş verilerin geri döndürülmesini sağlar. |
Bu tablo, Promise zincirinin son aşamasında kullanabileceğimiz .then() fonksiyonunun işlevlerini özetlemektedir. .then() fonksiyonunu kullanarak, API'den gelen verileri işleyip sonucu döndürebiliriz.
Örneğin, aşağıdaki kod API'den veri çekerken .then() kullanır:
fetch('https://jsonplaceholder.typicode.com/todos/1') .then(res => { if (res.status !== 200) { throw new Error('API Hatası'); } return res.json(); }) .then(data => { console.log(data); }) .catch(err => { console.log(err.message); });
Bu kodda, fetch() fonksiyonu kullanarak API'den veri alınır. Eğer API'den dönen cevap (response) başarılı değilse, throw ile hata mesajı döndürülür. Eğer cevap başarılıysa, .json() fonksiyonu ile verilerin dönüşü sağlanır ve .then() fonksiyonu içinde işlenir. Bu örnekte, sonuç console.log ile gösterilir.
return data;return data;
satırı, API'den alınan verilerin Promise zincirindeki son halkasıdır. Eğer istek başarılıysa res.json()
ile veriler alınır, ardından return data;
ile başarılı sonucun döndürülmesi sağlanır. Eğer hata alınırsa, önceki then
bloklarında throw
edilerek Reject bloğuna yönlendirilir ve hata mesajı döndürülür.
The final part of the code block is the closing bracket for the getData function. It indicates the end of the function and encapsulates the entire Promise chain that retrieves data from the API. By using the Promise architecture and chaining multiple Promises together, we can effectively manage and handle both successful and unsuccessful results. The closing bracket signals the end of the operation and ensures that the function is complete and ready to be called when necessary.
.catch(err.catch(err => {} bloğu, eğer Promise zinciri herhangi bir aşamada hatalı sonuçlanırsa çalışacak kısımdır. Bu blokta, hatanın nedeni belirtilerek hata mesajı döndürülür. Yukarıdaki örnek kodda da görebileceğiniz gibi, eğer fetch işlemi başarısız olursa throw ile hata mesajı döndürülür. Bu şekilde, Promise'in Reject bloğu tetiklenir ve hatanın sebebi açıkça belirtilir.
console.log(err.message);İşlem sırasında bir hata oluştuğunda, hata mesajını göstermek için console.log(err.message)
komutu kullanılabilir.
});, Promise zincirinin sonunu belirten bir parçadır. Bu kısımda, olumsuz veya olumlu sonuç ne olursa olsun, sonuçlandırmayı tamamlamak için kullanılır. Aynı zamanda, sonuçların kontrol edilmesi ve istenmeyen hataların tespit edilmesi için kullanılabilir.
}Promise chaining kullanarak, aynı anda birden fazla işlem yapılan senaryolarda işlemlerin sıralı bir şekilde gerçekleştirilmesi sağlanır. Bu da, yapılan işlemlerin daha düzenli ve kontrol edilebilir olmasını sağlar.
Örneğin, bir kullanıcının kayıt olması sırasında yaptığı işlemler şöyle olabilir:
- E-posta adresi doğrulama
- Parola doğrulama
- Kullanıcı adı doğrulama
- Veritabanına kayıt işlemi
Bu işlemler sırasıyla gerçekleştirilmelidir. Eğer bir işlem başarısız olursa, diğer işlemlerin yapılması gereksiz olur. Bu durumda, Promise chaining kullanarak işlemlerin sırasını düzenleyebiliriz.
Aşağıdaki örnek kod, kullanıcının kayıt olma işlemini gerçekleştiren bir API'den veri çekerek Promise chaining yöntemiyle işlemleri sıralı bir şekilde gerçekleştirir.
```javascriptconst fetch = require('node-fetch');
function validateEmail() { return fetch('https://emailvalidator.com/api/validate?email=test@example.com') .then(response => response.json()) .then(data => { if (data.valid) { return data; } else { throw new Error('E-posta adresi doğrulanamadı.'); } });}
function validatePassword() { return fetch('https://passwordvalidator.com/api/validate?password=password123') .then(response => response.json()) .then(data => { if (data.valid) { return data; } else { throw new Error('Parola doğrulanamadı.'); } });}
function validateUsername() { return fetch('https://usernamevalidator.com/api/validate?username=example') .then(response => response.json()) .then(data => { if (data.valid) { return data; } else { throw new Error('Kullanıcı adı doğrulanamadı.'); } });}
function registerUser() { return fetch('https://userregistrationapi.com/api/register', { method: 'POST', body: JSON.stringify({ email: 'test@example.com', password: 'password123', username: 'example' }), headers: {'Content-type': 'application/json; charset=UTF-8',}, }) .then(response => response.json()) .then(data => { if (data.successful) { return data; } else { throw new Error('Kayıt işlemi başarısız oldu.'); } });}
validateEmail() .then(() => validatePassword()) .then(() => validateUsername()) .then(() => registerUser()) .then(data => console.log(data)) .catch(error => console.log(error.message));```
Bu örnek kod, kullanıcının e-posta adresi, parola ve kullanıcı adı doğrulaması yapıldıktan sonra veritabanına kaydının yapılmasını sağlar. Promise chaining kullanarak işlemlerin sıralı bir şekilde gerçekleştirildiği bu örnek kodda, herhangi bir işlem başarısız olursa kayıt işlemi yapılmayacaktır.
getData().then(datagetData() Promise örneği, özellikle API isteklerinde kullanım için faydalıdır. Kod yazarken Reject ve Resolve kullanarak hata mesajları ve başarılı sonuçlar döndürmek için kullanılabilir. Aşağıdaki örnek kod, bir API'den veri çekerek Reject ve Resolve kullanımını göstermektedir.
Bu kodda, fetch modülü kullanarak bir API isteği atılır ve sonuçları Promise ile beklenir. Eğer sonuç başarılıysa Resolve ile sonuçlar, değilse Reject ile hata mesajı döndürülür.
Kod Satırı | İşlem |
---|---|
fetch('https://jsonplaceholder.typicode.com/todos/1') | Bir API isteği atılır. |
then(res => {...} | Sonuçlar Promise ile beklenir ve sonuç başarılıysa Resolve kullanılarak sonuçlar döndürülür. |
then(data => {...}) | Kodda, daha sonra diğer işlemler için kullanılmak üzere, data değişkeninde sonuçlar alınır. |
catch(err => {...}) | Eğer API isteği başarısız olursa, Reject kullanılarak hata mesajı döndürülür. |
Kod, getData() fonksiyonu ile çağrılır ve sonuçlar konsolda görüntülenir.
console.log(data);console.log(data);
kodu, Promise başarılı olursa sonuçlarını gösterir. Bu kod, API'den alınan verileri konsola yazdırır. Eğer başarısız olursa, Reject kullanarak hata mesajı döndürülür. Bu sayede, gerekli işlemler yapılarak olumlu veya olumsuz senaryolara göre işlemler gerçekleştirilebilir.
Sonuç olarak, Node.js'te Reject ve Resolve kullanarak Promise zincirinin sonundaki işlemleri kontrol edebiliriz. Bunlar, API istekleri, dosya okuma ve yazma işlemleri gibi uzun süreli işlemlerde kullanışlıdır. Hatalı veya başarılı senaryolarda doğru sonuçların teslim edilmesini sağlarlar. Kodun okunabilirliğini arttırmak için Promise chaining yapısı tercih edilebilir. Ancak, Promise chaining kullanırken hataların kontrol edilmesi önemlidir. Ayrıca, hatanın nasıl işleneceği de belirtilmelidir.
```Bu kodda, ```node-fetch``` modülü kullanılarak bir API'den veri çekilmektedir. Veri, Promise zinciri ile işlenmektedir. Öncelikle, Promise'in başarısız olması durumunda ```reject``` kullanılarak hata mesajı döndürülmektedir. Ardından, Promise'in başarılı olması durumunda ```resolve``` kullanılarak veri objesi döndürülmektedir. Örneğimiz bu şekilde, Reject ve Resolve kullanımını anlamak için basit ve anlaşılır bir örnek oluşturmaktadır.