JavaScript'te Çözülmüş Promise'ler Oluşturma
Bazen zaten çözülmüş bir promise oluşturmanız
gerekebilir. Bunun için iki yöntem vardır:
Promise.resolve yöntemi başarıyla
çözülmüş bir promise oluşturur, Promise.reject
yöntemi ise reddedilmiş bir promise oluşturur.
Bu yöntemler parametre olarak, sırasıyla promise'in
sonucu veya hatası olacak şeyi alır.
Zaten çözülmüş bir promise ne zaman gerekli olabilir? Bir örnek üzerinden inceleyelim. Bir sayıyı parametre olarak alan, onunla eşzamansız olarak bir şeyler yapan ve sonuçla birlikte bir promise döndüren bir fonksiyonumuz olsun:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Fonksiyonumuzu şu şekilde kullanacağız:
func(5).then(function(res) {
console.log(res); // 25 yazdıracak
});
Şimdi diyelim ki, eşzamansız işlemi yalnızca sıfırdan büyük bir sayı verilirse gerçekleştirmeye karar verdik. Aksi takdirde, fonksiyonun sonucu sıfır olmalı:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // sıfır sonuç
}
}
Ancak, şimdi fonksiyonun bir promise VEYA bir sayı
döndürdüğü ortaya çıkıyor. Bu nedenle, fonksiyonun
sonucuna then yöntemini artık uygulayamayız,
çünkü fonksiyon bir sayı döndürdüğünde bir hata alırız:
func(0).then(function(res) { // hata, then metodunu sıfıra uyguluyoruz
});
Bu sorunu Promise.resolve ile düzeltebiliriz:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // sayı değil, promise döndürüyoruz
}
}
Şimdi diyelim ki, iletilen sıfır için sıfır
döndürmemiz, sıfırdan küçük sayılar için ise
bir istisna oluşturmamız gerektiğine karar verdik.
Bu durumda Promise.reject yöntemi bize yardımcı olacaktır:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else if (num === 0) {
return Promise.resolve(0);
} else {
return Promise.reject('incorrect number'); // reddedilmiş bir promise döndür
}
}