it-swarm.com.de

Angular HttpPromise: Unterschied zwischen `success` /` error` Methoden und `then` Argumenten

Gemäß AngularJS doc geben Aufrufe von $http Folgendes zurück:

Gibt ein Versprechungsobjekt mit der Standardmethode then und zwei http-spezifischen Methoden zurück : Erfolg und Fehler . Die then Methode benötigt zwei Argumente: einen Erfolg und einen Fehler Rückruf, der mit einem Antwortobjekt aufgerufen wird. Die Methoden success und error verwenden ein einziges Argument - eine Funktion, die dies ermöglicht aufgerufen werden, wenn die Anforderung erfolgreich ist oder fehlschlägt. Die an diese Funktionen übergebenen Argumente sind eine destrukturierte Darstellung des an die then-Methode übergebenen Antwortobjekts.

Abgesehen von der Tatsache, dass das Objekt response in einem Fall zerstört ist, verstehe ich den Unterschied nicht zwischen

  • die übergebenen Erfolgs-/Fehler-Rückrufe werden als Argumente von promise.then übergeben.
  • die Rückrufe wurden als Argumente für die Methoden promise.success/promise.error des Versprechens übergeben

Gibt es irgendwelche? Worum geht es bei diesen beiden verschiedenen Möglichkeiten, scheinbar identische Rückrufe zu übermitteln?

176

[~ # ~] nb [~ # ~] Diese Antwort ist sachlich falsch; Wie in einem Kommentar unten ausgeführt, success () gibt das ursprüngliche Versprechen zurück. Ich werde es nicht ändern. und überlasse es OP zu bearbeiten.


Der Hauptunterschied zwischen den beiden besteht darin, dass der Aufruf .then() ein Versprechen zurückgibt (das mit einem von einem Rückruf zurückgegebenen Wert aufgelöst wird), während der Aufruf .success() eine traditionellere Methode zum Registrieren von Rückrufen darstellt und kein zurückgibt versprechen.

Promise-based Callbacks (.then()) machen es einfach, Versprechen zu verketten (einen Anruf zu tätigen, Ergebnisse zu interpretieren und dann einen weiteren Anruf zu tätigen, Ergebnisse interpretieren, erneut anrufen usw.).

Die .success() -Methode ist eine optimierte, bequeme Methode, wenn Sie keinen Kettenaufruf ausführen oder mit der Versprechen-API arbeiten müssen (z. B. beim Routing).

Zusamenfassend:

  • .then() - volle Leistung der Versprechen-API, aber etwas ausführlicher
  • .success() - gibt kein Versprechen zurück, bietet jedoch eine etwas praktischere Syntax
155

Hier gibt es bereits einige gute Antworten. Aber es lohnt sich, den Unterschied in der angebotenen Parallelität nach Hause zu fahren:

  • success() gibt das ursprüngliche Versprechen zurück
  • then() gibt ein neues Versprechen zurück

Der Unterschied besteht darin, dass then() sequentielle Vorgänge steuert, da jeder Aufruf ein neues Versprechen zurückgibt.

$http.get(/*...*/).
  then(function seqFunc1(response){/*...*/}).
  then(function seqFunc2(response){/*...*/})
  1. $http.get()
  2. seqFunc1()
  3. seqFunc2()

success() treibt parallele Operationen an, da Handler nach demselben Versprechen verkettet sind.

$http(/*...*/).
  success(function parFunc1(data){/*...*/}).
  success(function parFunc2(data){/*...*/})
  1. $http.get()
  2. parFunc1(), parFunc2() parallel
203
event_jr

Einige Codebeispiele für eine einfache GET-Anforderung. Vielleicht hilft das, den Unterschied zu verstehen. Mit then:

$http.get('/someURL').then(function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // success handler
}, function(response) {
    var data = response.data,
        status = response.status,
        header = response.header,
        config = response.config;
    // error handler
});

Mit success/error:

$http.get('/someURL').success(function(data, status, header, config) {
    // success handler
}).error(function(data, status, header, config) {
    // error handler
});
114
TheHippo

.then () ist verkettbar und wartet auf die Auflösung des vorherigen .then ().

.success () und .error () können verkettet werden, aber sie werden alle auf einmal ausgelöst (so viel weist nicht darauf hin)

.success () und .error () sind nur nützlich für einfache Aufrufe (einfache Entscheidungsträger):

$http.post('/getUser').success(function(user){ 
   ... 
})

sie müssen das also nicht eingeben:

$http.post('getUser').then(function(response){
  var user = response.data;
})

Aber im Allgemeinen behandle ich alle Fehler mit .catch ():

$http.get(...)
    .then(function(response){ 
      // successHandler
      // do some stuff
      return $http.get('/somethingelse') // get more data
    })
    .then(anotherSuccessHandler)
    .catch(errorHandler)

Wenn Sie <= IE8 unterstützen müssen, schreiben Sie Ihre .catch () und .finally () wie folgt (reservierte Methoden in IE):

    .then(successHandler)
    ['catch'](errorHandler)

Arbeitsbeispiele:

Hier ist etwas, das ich in mehr Codey-Format geschrieben habe, um mein Gedächtnis darüber aufzufrischen, wie alles mit dem Umgang mit Fehlern usw. abläuft:

http://jsfiddle.net/nalberg/v95tekz2/

27
nawlbergs

Zur Vervollständigung hier ein Codebeispiel, das die Unterschiede aufzeigt:

erfolg\Fehler:

$http.get('/someURL')
.success(function(data, status, header, config) {
    // success handler
})
.error(function(data, status, header, config) {
    // error handler
});

dann:

$http.get('/someURL')
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
})
.then(function(response) {
    // success handler
}, function(response) {
    // error handler
}).
17
MichaelLo

Offizieller Hinweis: Erfolg und Fehler sind veraltet, bitte verwenden Sie stattdessen die Standard-then-Methode.

Hinweis zur Nichtbeachtung: Die erfolgreichen und fehlerhaften $ http-Versprechungsmethoden sind veraltet. Verwenden Sie stattdessen die Standard-then-Methode. Wenn $ httpProvider.useLegacyPromiseExtensions auf false gesetzt ist, werden diese Methoden einen $ http/legacy-Fehler auslösen.

Link: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http

Screenshot: Screenshot ansehen

2
MagicBoy