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

0
sakekasi 17 sierpień 2014, 03:06

2 odpowiedzi

Najlepsza odpowiedź

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);
}
6
Community 20 czerwiec 2020, 09:12

Q obietnice zapewniają niepowodzeniem, który jest wtedy, gdy jesteś zainteresowany tylko obsługą błędu

Jak wspomniana dokumentacja, to tylko skrót

-2
monkeyinsight 16 sierpień 2014, 23:12