Gewusst wie: zurückgeben von Daten aus Versprechen
Ich brauche, um die Antwort.Daten aus dem Versprechen, damit es zurückgegeben werden kann, das von der umgebenden Funktion. Ich weiß, ich kann es wahrscheinlich nicht mehr den Weg, den ich codiert haben, weil der normale javascript-Bereich. Gibt es eine Möglichkeit, es kann getan werden?
Die Konsole.log #1 erzeugt die korrekten Daten. console.log #2 erzeugt immer 'a';
function addSiteParentId(nodeId) {
var theParentId = 'a';
var parentId = relationsManagerResource.GetParentId(nodeId)
.then(function(response){
theParentId = response.data;
console.log(theParentId); //#1
});
console.log(theParentId); //#2
return theParentId;
}
Alle Hinweise wären sehr willkommen.
Haben Sie sich die Mühe der Suche für vorhandene Fragen zu diesem Thema?
Nein - man kann nicht alle Operationen, die Sie tun möchten, mit
Hier geht es nicht um die Rückgabe von Daten von einem Versprechen. Die zweite
ja hatte ich aber es gab nur Beschwerden über die Frage nicht spezifisch genug, was wahr war.
Nein - man kann nicht alle Operationen, die Sie tun möchten, mit
response
muss gehen in die .then()
handler. Sie können nicht schreiben, asynchrones Javascript in einer synchronen Stil!Hier geht es nicht um die Rückgabe von Daten von einem Versprechen. Die zweite
console.log
geschieht, bevor das Versprechen setzt theParentId
variable - denn das Versprechen ist async, während die console.log
ist nicht.ja hatte ich aber es gab nur Beschwerden über die Frage nicht spezifisch genug, was wahr war.
InformationsquelleAutor Craig | 2016-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eines der grundlegenden Prinzipien, die hinter ein Versprechen ist, dass es asynchron verarbeitet. Dies bedeutet, dass Sie können nicht erstellen Sie ein Versprechen, und dann sofort Ihr Ergebnis synchron in Ihrem code (z.B. ist es nicht möglich, dass Sie das Ergebnis einer Verheißung, die innerhalb der Funktion ausgelöst hat, das Versprechen).
Was Sie wahrscheinlich wollen zu tun, sondern ist wieder die gesamte Verheißung selbst. Dann, was Funktion muss Ihr Resultat nennen kann
.then()
auf das Versprechen, und das Ergebnis wird da sein, wenn das Versprechen wurde behoben.Hier ist eine Ressource, die von HTML5Rocks, geht über den Lebenszyklus eines Versprechen, und wie Ihr Ausgang ist gelöst asynchron:
http://www.html5rocks.com/en/tutorials/es6/promises/
InformationsquelleAutor Maximillian Laumeister
Ich auch nicht, wie eine Funktion zu behandeln, eine Eigenschaft, die hat gewesen aufgelöst, wieder und wieder in jedem controller und service. Scheint ich bin nicht allein 😀
Nicht versucht, das Ergebnis mit einem Versprechen als eine variable, natürlich keine Möglichkeit. Aber das habe ich gefunden und verwenden die Lösung unten, um Zugriff auf das Ergebnis als eine Eigenschaft.
Erstens schreiben Sie das Ergebnis auf eine Eigenschaft des service:
Nun, wir müssen nur sicherstellen, dass die Methode addSiteParentId immer gelöst werden, bevor wir Zugriff auf die Eigenschaft theParentId. Wir erreichen dies, indem Sie einige Möglichkeiten.
Verwenden Sie beheben in der router-Methode:
beheben: {
parentId: Funktion (your_factory){
your_factory.addSiteParentId();
}
}
dann in controller-und andere Dienstleistungen, die Sie in Ihrem router haben, rufen Sie einfach your_factory.theParentId, um Ihr Eigentum.
Referce hier weitere Informationen:
http://odetocode.com/blogs/scott/archive/2014/05/20/using-resolve-in-angularjs-routes.aspx
Verwenden Sie 'run' - Methode der app zu beheben Ihren Dienst.
app.run(function(your_factory){your_factory.addSiteParentId();})
Injizieren es in den ersten controller oder Dienstleistungen, die von dem controller. In der Steuerung können wir rufen alle erforderlichen init-services. Dann bleiben alle Controller, die als Kinder von Haupt-controller zugegriffen werden kann, um diese Eigenschaft normalerweise, wie Sie wollen.
Wählen Sie Ihre Möglichkeiten hängen von Ihrem Kontext abhängen Umfang Ihrer Variablen und Lesen Frequenz der variable.
InformationsquelleAutor Vu Quyet
Ein Weg, um die Daten auf ein Versprechen ist auf diese Weise
Objekt.zuweisen : https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Offensichtlich Hector schreibt den code, nicht die Kommentare?
Die Erklärung von @MaximillianLaumeister es ist sehr besten.
Ich bin nicht zu urteilen und ich habe deinen code nicht getestet, ich dachte nur, dass es schön wäre, wenn man könnte hinzufügen von text zu Ihrem Beitrag, zu erklären, und warum Sie denken, es ist gut. Es kann sehr gut sein, der beste : )
InformationsquelleAutor Hector Cardoso
Haben Sie, um wieder eine Versprechen statt einer Variablen.
So in Ihrer Funktion nur zurückgeben:
Und später beheben, die zurückgegeben Versprechen.
Oder Sie können zu anderen latenten und beheben
theParentId
.InformationsquelleAutor Mehdi Seifi