Fark ne?
.then()
Çağrı geri arama bir hata atar durumda reddedilecek bir söz dönecektir. Bu, başarınız logger
başarısız olduğunda, hatanın aşağıdaki .catch()
geri aramaya iletileceği , ancak fail
yan yana gelen geri aramaya geçilmeyeceği anlamına gelir success
.
İşte bir kontrol akış şeması:
Senkronize kodda ifade etmek için:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
İkincisi log
(ilk argüman gibi .then()
) yalnızca istisna olmaması durumunda yürütülür. Etiketli blok ve break
ifade biraz garip hissediyorum, aslında python try-except-else
için olan budur (önerilen okuma!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
catch
Kaydedicisi de başarı logger çağrısından istisnalar işleyecektir.
Fark için çok fazla.
Denemek ve yakalamak için açıklamasını tam olarak anlamıyorum
Argüman, genellikle işlemenin her adımında hata yakalamak istediğiniz ve bunu zincirlerde kullanmamanızdır. Beklenti, tüm hataları işleyen yalnızca bir son işleyiciniz olması - "karşıt nokta" yı kullandığınızda, o zaman geri çağrıların bazılarındaki hatalar işlenmez.
Ancak, bu desen gerçekten çok yararlıdır: Tam olarak bu adımda meydana gelen hataları işlemek istediğinizde ve hata olmadığında tamamen farklı bir şey yapmak istediğinizde (yani hata kurtarılamaz olduğunda). Unutmayın bu olduğunu dallanma kontrol akışını. Tabii ki, bu bazen istenir.
Bunun nesi yanlış?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Geri aramanızı tekrarlamanız gerektiğini. İstiyorsun
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Bunun .finally()
için kullanmayı da düşünebilirsiniz .
then().catch()
virgül ve araştırmaya gerek duymadığınız için daha okunabilirdir.