2016-04-28 10 views
1

In Angularjs wenn $ q verwenden, warum nicht diesen Code:

$q.when("test") 
    .then($q.reject("error")) 
    .then(
    function(v) { 
     $scope.result = "Success: " + v; 
    }, 
    function(e) { 
     $scope.result = "Failure: " + e; 
    } 
    ) 

Aufruf des Fehler Rückruf?

In einem jsfiddle: http://jsfiddle.net/c9tv6kz7/1/

+0

Sie wollen '$ q.when (" error "). Dann ($ q.reject)' – Bergi

Antwort

2

Je mehr einfache Antwort ist, dass:

$q.reject("error")

ein Objekt neues Versprechen erstellt, die von Ihrem $q.when().then() aufgerufen wird.

Dies wird wirklich nicht tun, was Sie denken. $q.reject("error") gibt ein Objekt mit einer then Funktion zurück.

Blick auf dem Abschnitt Methoden im docs:

promiseB = promiseA.then(function(result) { 
    // success: do something and resolve promiseB 
    //   with the old or a new result 
    return result; 
}, function(reason) { 
    // error: handle the error if possible and 
    //  resolve promiseB with newPromiseOrValue, 
    //  otherwise forward the rejection to promiseB 
    if (canHandle(reason)) { 
    // handle the error and recover 
    return newPromiseOrValue; 
    } 
    return $q.reject(reason); 
}); 

Siehst du, wie sie then(function() { return $q.reject(reason); }) tun, die sehr verschieden von dem Original ist.

Siehe neue fiddle

2

Per the doc

then(successCallback, errorCallback, notifyCallback) – regardless of when the promise was or will be resolved or rejected, then calls one of the success or error callbacks asynchronously as soon as the result is available. The callbacks are called with a single argument: the result or rejection reason. Additionally, the notify callback may be called zero or more times to provide a progress indication, before the promise is resolved or rejected.

This method returns a new promise which is resolved or rejected via the return value of the successCallback, errorCallback (unless that value is a promise, in which case it is resolved with the value which is resolved in that promise using promise chaining). It also notifies via the return value of the notifyCallback method. The promise cannot be resolved or rejected from the notifyCallback method.

Die Linie, die wir wirklich wichtig ist

This method returns a new promise which is resolved or rejected via the return value of the successCallback, errorCallback

Jedes Mal, wenn Sie then auf $q.when rufen Sie ein neues Versprechen erstellen. Obwohl das erste Versprechen abgelehnt wurde, war das zweite nicht. Die zweite wurde nicht abgelehnt, weil der Rückgabewert von successCallback und errorCallback sie nicht ablehnte.

+0

Nicht sicher, ich folge. Was ich erwarte, ist: 1) "wenn" eine Verheißung schafft, die sofort mit Erfolg verrechnet wird 2) "Zurückweisung" erzeugt eine Verheißung, die sofort vereitelt (zurückweist) 3) "dann" schafft eine Verheißung, die die erste löst , dann die zweite 4) Wenn einer der beiden fehlschlägt, sollte 'dann' mit einem Fehler auflösen. –

+0

Das Missverständnis ist, dass Sie erwarten, dass Ihre Versprechen miteinander verbunden sind. So wie du es geschrieben hast, ist das nicht der Fall. Jedes deiner Versprechen ist unabhängig vom vorherigen. Wenn also einer scheitert, wird der andere nicht. – gh9

0

Wenn ich es so tun, ich einen Fehler beheben:

var myApp = angular.module('myApp', []); 

myApp.controller('MyCtrl', ['$scope', '$q', function($scope, $q) { 
    $q.when("test") 
    $q.reject('Failed!') 
    .then(
     function(v) { 
     $scope.result = "Success: " + v; 
     }, 
     function(e) { 
     $scope.result = "Failure: " + e; 
     } 
    ) 
}]); 

http://jsfiddle.net/emporio/67db45f9/3/

Wenn ich $q.reject('Failed!') entfernen, wird es zu lösen(), um .then.

+0

Sie erhalten den Fehler, weil $ q.reject ('fehlgeschlagen!') Ein fehlgeschlagenes Versprechen ist. Ihr Szenario ist nicht OPs. Ist das Szenario, wickelt er ein fehlgeschlagenes Versprechen in ein Versprechen ein. – gh9

+0

OP's? Was bedeutet das? – mdarmanin

+1

"Originalplakat" –

Verwandte Themen