Yani, temelde bu ikisi arasındaki farkın ne olduğunu soruyorsunuz (burada p
önceki bazı kodlardan oluşturulan bir söz var):
return p.then(...).catch(...);
ve
return p.catch(...).then(...);
P çözdüğünde veya reddettiğinde farklılıklar vardır, ancak bu farklılıkların önemli olup olmadığı .then()
veya .catch()
işleyiciler içindeki kodun ne yaptığına bağlıdır .
p
Çözüldüğünde ne olur :
İlk şemada, p
çözüldüğünde, .then()
işleyici çağrılır. Bu .then()
işleyici bir değer veya sonunda çözülen başka bir söz döndürürse, .catch()
işleyici atlanır. Ancak, .then()
işleyici sonunda reddeden bir söz atar veya döndürürse, .catch()
işleyici hem orijinal sözdeki bir ret için hem p
de .then()
işleyicide oluşan bir hata için yürütür .
İkinci şemada, p
çözüldüğünde, .then()
işleyici çağrılır. Bu .then()
işleyici, sonunda reddeden bir söz atar veya döndürürse, .catch()
işleyici bunu yakalayamaz çünkü zincirde önündedir.
Yani bu 1 numaralı fark. .catch()
İşleyici SONRA ise, işleyicinin içindeki hataları da yakalayabilir .then()
.
p
Reddedildiğinde ne olur :
Şimdi, ilk şemada, eğer söz p
reddederse, o zaman .then()
işleyici atlanır ve .catch()
beklediğiniz gibi işleyici çağrılır. Ne yapmak .catch()
işleyici nihai sonuç olarak döndürülür belirler. Yalnızca .catch()
işleyiciden bir değer döndürürseniz veya sonunda çözülen bir söz verirseniz, söz verme zinciri çözülmüş duruma geçer çünkü siz hatayı "ele alıp normal şekilde geri döndünüz". Uygulayıcıda reddedilen bir sözü verir veya geri verirseniz .catch()
, iade edilen söz reddedilmiş olarak kalır.
İkinci şemada, söz p
reddedilirse, .catch()
işleyici çağrılır. Eğer normal bir değer veya sonunda .catch()
işleyiciden çözülen bir vaat döndürürseniz (böylece hatayı "ele alır"), vaat zinciri çözümlenmiş duruma geçer ve çağrıldıktan .then()
sonra işleyici işleyiciye geçer .catch()
.
Yani bu 2 numaralı fark. Eğer .catch()
işleyici ÖNCE olduğunu, o zaman hatayı işlemek ve izin verebilir .then()
işleyici hala etmelerini sağlamak.
Hangisi ne zaman kullanılır:
.catch()
Ya orijinal sözdeki p
ya da .then()
işleyicideki hataları yakalayabilen tek bir işleyici istiyorsanız, ilk şemayı kullanın ve bir reddinin işleyiciyi p
atlaması gerekir .then()
.
İlk sözdeki hataları yakalayabilmek istiyorsanız ikinci şemayı kullanın p
ve belki (koşullara bağlı olarak), söz zincirinin çözülmüş olarak devam etmesine izin verin, böylece .then()
işleyiciyi çalıştırın .
Diğer seçenek
Her iki geri aramayı kullanmak için de olduğu .then()
gibi geçirebileceğiniz bir seçenek daha var :
p.then(fn1, fn2)
Bu, yalnızca birinin aranacağını fn1
veya aranacağını garanti eder fn2
. Eğer p
giderir, sonra fn1
çağrılır. Eğer p
reddeder, o zaman fn2
çağrılır. Sonuçtaki hiçbir değişiklik fn1
asla fn2
aranamaz veya tersi olamaz . Öyleyse, işleyicilerin kendisinde ne olursa olsun, iki işleyicinizden yalnızca birinin çağrıldığından kesinlikle emin olmak istiyorsanız, kullanabilirsiniz p.then(fn1, fn2)
.