Promisede 5 statik yöntem vardır. Kullanım durumlarını burada hızlı bir Åekilde ele alacaÄız.
Promise.resolve
Söz dizimi:
let promise = Promise.resolve(value);
Verilen value ile çözülmüŠolan bir söz verir.
Buradaki gibi:
let promise = new Promise(resolve => resolve(value));
Yöntem zaten bir deÄere sahipken kullanılır. Ancal bir söz içine âsarılmıÅâ olmasını ister.
ÃrneÄin, loadCached fonksiyonu aÅaÄıda urlyi alır ve sonucu hatırlar. Böylece aynı URLâdeki gelecekteki çaÄrılar hemen döndürülür.
function loadCached(url) {
let cache = loadCached.cache || (loadCached.cache = new Map());
if (cache.has(url)) {
return Promise.resolve(cache.get(url)); // (*)
}
return fetch(url)
.then(response => response.text())
.then(text => {
cache.set(url,text);
return text;
});
}
loadCached(url).then(â¦) kullanabiliriz. Ãünkü fonksiyonun bir söz döndürmesi garantilidir. Amaç Promise.resolve (*) doÄrultusunda hizmet eder: Arayüzünün birleÅik olduÄundan emin olun. .thenden sonra her zaman loadCached kullanabiliriz.
Promise.reject
Söz dizimi:
let promise = Promise.reject(error);
error ile reddedilen bir söz oluÅturun.
Yukarıdaki ile aynı:
let promise = new Promise((resolve, reject) => reject(error));
Gerçek kodda nadiren kullanılan, bütünlük için buradayız.
Promise.all
Paralel olarak yürütülmek için birçok söz vermek isteriz ve hepsinin hazır olmasını bekleriz.
ÃrneÄin, paralel olarak birkaç URLâyi indirin ve hepsi bittiÄinde içeriÄi iÅleyin.
Bunun için Promise.all.
Söz dizimi:
let promise = Promise.all([...promises...]);
Yeni bir söz alır ve bir dizi söz alır (Teknik olarak herhangi bir yinelenebilir nesne, ama çoÄunlukla bir array.)
Yeni söz, listelenen tüm sözlerin yerine getirildiÄi ve sonuçların bir dizisine sahip olduÄunda karar verir.
ÃrneÄin, aÅaÄıdaki Promise.all 3 saniye sonra yerleÅir ve sonucu [1, 2, 3] dizisidir:
Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
]).then(alert); // 1,2,3 sözler hazır olduÄunda: her söz bir dizi üyesine katkıda bulunur
Lütfen göreli sipariÅin aynı olduÄunu unutmayın. İlk sözün sözülmesi uzun sürse bile sonuçta ilk sırada yer almaktadır.
Yayın bir hile, bir dizi iÅ verisini bir dizi sözle eÅleÅtirmek ve ardından bunu Promise.all içine kaydırmaktır.
ÃrneÄin, eÄer bir dizi URLâmiz varsa hepsini Åöyle getirebiliriz:
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://api.github.com/users/jeresig'
];
// Her URL'yi getirme sözüyle eÅleyin
let requests = urls.map(url => fetch(url));
// Tüm iÅler çözülene kadar Promise.all bekler
Promise.all(requests)
.then(responses => responses.forEach(
response => alert(`${response.url}: ${response.status}`)
));
Bir dizi github kullanıcısı için kullanıcı bilgilerini adlarına göre almakla ilgili daha büyük bir örnek (veya bir mal dizisini kimlikleriyle alabiliriz. Mantık aynıdır):
let names = ['iliakan', 'remy', 'jeresig'];
let requests = names.map(name => fetch(`https://api.github.com/users/${name}`));
Promise.all(requests)
.then(responses => {
// Tüm cevaplar hazır. HTTP durum kodlarını gösterebiliriz
for(let response of responses) {
alert(`${response.url}: ${response.status}`); // Her URL için 200 gösterir
}
return responses;
})
// Yanıt dizisini, içeriÄini okumak için response.json() dizisine eÅleyin
.then(responses => Promise.all(responses.map(r => r.json())))
// Tüm JSON cevapları ayrıÅtırılır: "users" bunların dizisidir.
.then(users => users.forEach(user => alert(user.name)));
EÄer sözlerden herhangi biri ret edildiyse Promise.all bu hatayı hemen ret eder
ÃrneÄin:
Promise.all([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).catch(alert); // Error: Whoops!
İÅte ikinci söz iki saniye içinde reddediyor. Bu Promise.allun hemen reddedilmesine yol açar, bu yüzden .catch çalıÅtırır: reddedilme hatası tüm Promise.allun sonucudur.
EÄer bir söz reddederse, Promise.all derhal reddeder. Listedeki diÄerlerini tamamen unutur. Onların sonuçları göz ardı edilir.
ÃrneÄin, yukarıdaki örnekte olduÄu gibi birden fazla fetch çaÄrısı varsa ve biri baÅarısız olursa diÄeri hala yürütülmeye devam eder. Ancak Promise.all artık onları izlememektedir. Muhtemelen yerleÅecekler ancak sonuç göz ardı edilecektir.
Promise.all sözlerinde âiptalâ kavramı olmadıÄı için onları iptal edecek hiçbir Åey yapmaz. BaÅka bir bölümde bu konuda yardımcı olmayı amaçlayan AbortControllerı ele alacaÄız. Ancak bu Promise APIâsinin bir parçası deÄil.
Promise.all(...) allows non-promise items in iterableNormalde, Promise.all(...) sözlerin yenilenebilir (çoÄu durumda bir dizi) kabul eder. Ancak bu nesnelerden herhangi biri bir söz deÄilse Promise.respove içine sarılır.
ÃrneÄin burada `[1, 2, 3]` döner:
```js run
Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000)
}),
2, // Promise.resolve(2) olarak kabul edildi.
3 // Promise.resolve(3) olarak kabul edildi.
]).then(alert); // 1, 2, 3
Bu yüzden uygun olmayan durumlarda Promise.alla söz etmeyen deÄerleri aktarabiliriz.
Promise.allSettled
Herhangi bir söz reddederse Promise.all bir bütün olarak eder. Devam etmek için all sonuçlarına ihtiyacımız olduÄunda bu iyidir:
Promise.all([
fetch('/template.html'),
fetch('/style.css'),
fetch('/data.json')
]).then(render); // render yöntemi hepsine ihtiyaç duyuyor
Promise.allSettled tüm sözlerin yerine getirilmesini bekler: biri reddetse bile diÄerini bekler. Sonuçta ortaya çıkan dizin:
{status:"fulfilled", value:result}baÅarılı cevap için,{status:"rejected", reason:error}hatalar için.
ÃrneÄin, birden fazla kullanıcı hakkında bilgi edinmek istiyoruz. Bir istek baÅarısız olsa bile diÄerleriyle de ilgileniyoruz
Hadi Promise.allSettled kullanalım:
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://no-such-url'
];
Promise.allSettled(urls.map(url => fetch(url)))
.then(results => { // (*)
results.forEach((result, num) => {
if (result.status == "fulfilled") {
alert(`${urls[num]}: ${result.value.status}`);
}
if (result.status == "rejected") {
alert(`${urls[num]}: ${result.reason}`);
}
});
});
Yukarıdaki satırdaki results (*) olacak:
[
{status: 'fulfilled', value: ...response...},
{status: 'fulfilled', value: ...response...},
{status: 'rejected', reason: ...error object...}
]
Dolayısıyla, her söz için onun satütüsünü ve deÄer/sebep bilgisini alırız.
Polyfill
EÄer tarayıcı Promise.allSettled özelliÄini desteklemiyorsa, polyfill kolaydır.
if(!Promise.allSettled) {
Promise.allSettled = function(promises) {
return Promise.all(promises.map(p => Promise.resolve(p).then(v => ({
state: 'fulfilled',
value: v,
}), r => ({
state: 'rejected',
reason: r,
}))));
};
}
Bu kodda, promises.map giriÅ deÄerini alır, p => Promise.resolve(p) ile sözleri döndürüyor (sadece bir söz verilmemiÅse) ve sonra bunu iÅleyiciye ekler.
Bu iÅleyici baÅarılı bir v sonucusunu {state:'fulfilled', value:v} ve bir r hatasını {state:'rejected', reason:r} olarak çevirir. Bu Promise.allSettled formatıyla aynıdır.
Sonra bazı sonuçları reddetse bile sonuçları almak ya da all sözleri vermek için Promise.allSettledi kullanabiliriz.
Promise.race
Promise.all benzer Åekilde sözler yenilenebilir. Ancak hepsinin bitmesini beklemek yerine ilk sonucu (veya hatayı) bekler ve devam eder.
Söz dizimi:
let promise = Promise.race(iterable);
Mesela burada sonuç 1 olacak:
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
Böylece ilk sonuç/hata bütün Promise.race sonucu olur. İlk kararlaÅtırılan sözün ardından âyarıÅı kazanırâ, diÄer tüm sonuçlar/hatalar göz ardı edilir
Ãzetle
Promise sınıfının 5 statik metodu vardır:
Promise.resolve(value)â verilen deÄerle çözümlenmiÅ bir söz verir.Promise.reject(error)â verilen hata ile reddedilen bir söz verirâ¦Promise.all(promises)â çözmek için tüm sözleri bekler ve sonuçlarının bir dizisini döndürür. EÄer verilen sözlerden herhangi biri reddederse o zamanPromise.allhatası olur ve diÄer tüm sonuçlar göz ardı edilir.Promise.allSettled(promises)(yeni bir metod) â tüm sözlerin çözülmesini veya reddedilmesini bekler ve sonuçlarının bir dizisini nesne olarak döndürür.state:'fulfilled'yada'rejected'value(if fulfilled) ya dareason(reddedilirse).
Promise.race(promises)â ilk yerlmeÅmeye söz vermek için bekler ve sonucu/hatası sonuç olur. Bu beÅ maddedePromise.all/allSettleden yaygın kullanılanıdır.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)