2013-06-24 8 views
6

Mark Dalgleish schrieb eine nice little article über die Verwendung von Versprechen in AngularJS Ansichten. Einige Leute haben in den Kommentaren Fragen dazu gestellt, aber Mark hat sie (noch) nicht beantwortet. Weil ich mir die gleiche Frage bin gefragt, werde ich auf Stackoverflow fragen, anstatt eine Antwort zu bekommen:Verwenden von Versprechen in AngularJS Ansichten

  1. Wenn Sie verspricht in Ansichten verwenden, wie kann ich „Laden“/„Warten“ -Anzeige handhaben, weil sie sind asynchron? Hat ein Versprechen etwas wie eine "resolved" oder "inquestRequest" Eigenschaft?

  2. Wie gehe ich mit Fehlern um? Normalerweise würden sie im zweiten Callback auftreten, aber wenn ich ein Versprechen direkt in der Ansicht verwende, behandle ich diesen Fall nicht. Gibt es eine andere Art und Weise?

Vielen Dank.

+0

lesen Sie gerade über $ q auf eckige offizielle Dokumente und Ihre obigen zwei Fragen werden beantwortet –

+2

Es scheint nicht, dass #rtfm hier hilft, weil ich das Versprechen nicht programmatisch verwenden möchte, sondern aus der Sicht wie beschrieben in der Frage/Artikel. Das scheint nicht Teil der Dokumentation zu sein. – Pipo

Antwort

13

BEARBEITEN: ab dem Winkel v1.2 die resolution of promise in views is not activated by default.

Die automatische Auflösung von Versprechen in einer Ansicht sieht zunächst wie ein handliches Werkzeug aus, aber es gibt eine Reihe von Einschränkungen, die sorgfältig verstanden und bewertet werden müssen. Das größte Problem bei diesem Ansatz ist, dass AngularJS Rückrufe zu einem Versprechen hinzufügen wird und wir wenig Kontrolle darüber haben.

beantworten Ihre Fragen:

1) Wie bereits erwähnt, ist es letztlich AngularJS, die ein Erfolg/Fehler Callbacks hinzufügen, so dass wir hier nicht viel Einfluss haben. Sie können das ursprüngliche Versprechen in ein benutzerdefiniertes Versprechen umwandeln, das die Auflösung verfolgt. Aber diese Art von geschickten den ganzen Zweck der Rettung von wenigen Tastenanschlägen. Und nein, es gibt keine Dinge wie "aufgelöst". Kurz gesagt - es gibt keinen universellen Mechanismus zur Verfolgung von Fortschritten, der für alle Versprechen funktionieren würde. Wenn Ihre Versprechen $http -based sind, können Sie Interceptors oder pendingRequests -Eigenschaft verwenden, um Anforderung in Bearbeitung zu verfolgen.

2) Sie können nicht. AngularJS fügt wiederum einen Handler in den Dienst $parse ein und sieht so aus: promise.then(function(val) { promise.$$v = val; }); (siehe Code here). Sie können sehen, dass nur ein Erfolgsrückruf hinzugefügt wird, so dass alle Fehler stillschweigend ignoriert werden.

Dies sind nicht die einzigen Einschränkungen der automatischen Verspre- chensauflösung in der Ansicht. Das andere Problem besteht darin, dass die von einer Funktion zurückgegebenen Versprechen nicht korrekt gelöst werden. wenn Sie ein Beispiel, wie so würde umschreiben Zum Beispiel:

myModule.controller('HelloCtrl', function($scope, HelloWorld) { 

    $scope.messages = function() { 
    return HelloWorld.getMessages(); 
    } 
}); 

und versuchen, das folgende Markup zu verwenden:

<li ng-repeat="message in messages()"></li> 

Dinge würden wie erwartet, die als Überraschung kommen könnte.

Kurz gesagt: Während die automatische Auflösung von Versprechen wie eine praktische Abkürzung scheint, hat sie eine Reihe von Einschränkungen und nicht offensichtlichen Verhaltensweisen. Bewerten Sie diese sorgfältig und entscheiden Sie, ob es sich lohnt, wenige Tastenanschläge zu speichern.

+0

Vielen Dank für Ihre ausführliche Antwort. – Pipo

+2

"Versprechen, die von einer Funktion zurückgegeben werden, werden nicht korrekt gelöst", aber "Dinge funktionieren wie erwartet" - sollte das nicht "würde nicht" sein? ;) – schellmax