it-swarm.com.de

Wie bekomme ich den Wert des Versprechens, der bereits gelöst wurde?

Ich habe ein Versprechen, an das ich in meiner Benutzeroberfläche gebunden bin. Wenn das Versprechen aufgelöst ist und das UI-Element dargestellt wird, kann ich auf dieses UI-Element klicken. In meinem Controller-Code, wo ich mit dem Klick umgehe, möchte ich auf den Wert des Versprechens eingehen. An diesem Punkt in meinem Winkelcode weiß ich bereits, dass das Versprechen gelöst ist. Aber wenn ich den Wert erhalten möchte, ist es immer noch ein Versprechen.

Was ist der beste Weg, um den Wert des Versprechens zu erhalten ... vorausgesetzt, ich weiß, dass es gelöst werden muss?

16
sthomps

Versprechen sind immer Versprechen - und so sollten sie sein. Es ist zwar möglich, ein Versprechen direkt an die Ansicht zu binden, aber ich lehne diese Praxis im Allgemeinen ab, da sie nicht transparent ist und zu flackernden Ansichten führen kann. Eine bessere Lösung ist das Zuweisen eines Gültigkeitsbereichs in einem Aufruf von then:

myService.then(function( val ) {
  $scope.val = val;
});

Wenn $scope.val bereit ist, kann es immer direkt als Wert behandelt werden - weil es ist.

Das heißt, wenn Sie den Versprechenauftrag direkt ausführen möchten, müssen Sie ihn nur als Versprechen behandeln. Das heißt, Sie müssen promise.then(function () { ... }); aufrufen. Dies scheint eine Unbequemlichkeit zu sein, aber es ist tatsächlich ein Beweis dafür, wie mächtig Versprechen sind.

Wenn Sie weitere Informationen zu Versprechungen wünschen, habe ich für einen kürzlich veröffentlichten Google+ Hangout zu diesen Vorträgen beigetragen (und Codebeispiele zur Verfügung gestellt), in denen ich die Vorteile, allgemeinen Verwendungsmöglichkeiten und bewährten Vorgehensweisen von Versprechen in AngularJS behandelte: AngularJS Hangout - Versprechen Versprechen Versprechen, Versprechen . Die Idee nie endender Versprechungsketten wurde speziell angesprochen, obwohl ich keinen Timecode im Kopf habe.

Hoffe das hilft!

21

Es ist schwierig zu verstehen, dass Sie vielleicht denken, wenn das Versprechen noch nicht voll ist, dann kann ich vielleicht ein wenig warten, um noch einmal zu testen, ob es einen Wert hat. Das ist aber nicht möglich, denn wie auf MDN erklärt: 

"Callbacks werden niemals aufgerufen, bevor der aktuelle Lauf der JavaScript-Ereignisschleife abgeschlossen ist." 

Solange Ihre aktuell gestartete Funktion läuft, kann das Promise nicht voll sein. Es hat während der aktuellen Ausführung der Ereignisschleife keinen "Wert". "Versprechen" bedeutet "Ich verspreche, es Ihnen vielleicht während der NEXT-Ereignisschleife zu geben".

Sie können dieses Versprechen in einer globalen Variablen speichern. Wenn dann ein Benutzer auf eine Schaltfläche im Browser klickt, wird eine neue Ereignisschleife gestartet, indem Sie Ihren Event-Handler ausführen, der ein anderes "when ()" auf das Versprechen setzen kann Zu diesem Zeitpunkt ist die neue when-Funktion aufgelöst und übernimmt den Wert, den sie als Argument erhält, und speichert ihn in einer Variablen, aus der Sie ihn lesen können. Sie müssen es nicht auf die Konsole schreiben, um zu sehen, dass es da ist. 

Das war für mich der knifflige Teil. Ich dachte, ich könnte sicher sagen, dass ich das Promise in die Konsole schreiben kann, aber ich kann nicht von der Konsole lesen. Wie kann ich diesen Wert in den Rest meines Programms einbringen? Antwort: Warten Sie, bis die aktuelle Ereignisschleife beendet ist. Dann können Sie. 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

0
Panu Logic