Tylko szybkie pytanie wyjaśniające:
Czy istnieje różnica między
promiseGeneratingFunction.then(successHandler, errorHandler).done();
I
promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();
?
Dzięki
2 odpowiedzi
Tak, te dwa przykłady są różne.
Pozostałe odpowiedzi nie rozważają wpływu łańcucha. Dokumenty mówią:
A sugar method, equivalent to promise.then(undefined, onRejected).
Więc tak, .catch
jest równoważny .then
. Ale to nie są twoje przykłady.
Porównujesz
promiseGeneratingFunction.then(successHandler, errorHandler).done();
// VS
promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();
Jeśli złamymy drugi przykład w dół za pomocą udokumentowanego porównania, jest to właściwie:
promiseGeneratingFunction.then(successHandler, errorHandler).done();
// VS
promiseGeneratingFunction.then(successHandler).then(undefined, errorHandler).done();
Te dwa zachowują się inaczej w sposobie, w jaki obsługują błędy. Oba przykłady zadzwonią successHandler
, jeśli wygenerowana obietnica się powiedzie, a zadzwoń errorHandler
Jeśli obietnica się nie powiedzie, więc są bardzo podobne. Różnica pochodzi z tego, jak obsługują błędy w successHandler
.
// this is a fulfilled promise since the thrown error was handled
Promise.resolve().then(function(){ throw new Error(); }).catch(function(){});
// this is a rejected promise
Promise.resolve().then(function() { throw new Error() }, function(){});
Jeśli funkcja successHandler
miała wyrzucić wyjątek (lub zwrócić odrzuconą obietnicę), Twój pierwszy przykład nie ma załączonego obsługi błędów (errorHandler
jest przyłączony tylko do promiseGeneratingFunction
, więc obietnica rzuci Niepokarany wyjątek od .done()
Równoważny kod synchroniczny jest taki:
var error = null;
var result;
try {
result = func();
} catch (err){
error = err;
}
if (error){
errorHandler(error);
} else {
successHandler(result);
}
// VS
try {
var result = func();
successHandler(result);
} catch (err){
errorHandler(err);
}
Q obietnice zapewniają niepowodzeniem, który jest wtedy, gdy jesteś zainteresowany tylko obsługą błędu
Jak wspomniana dokumentacja, to tylko skrót