Wie man eine variable zurückgegeben, die über mehrere Funktionen - Javascript/jQuery
Diese Frage in der Zusammenfassung ist es, herauszufinden, wie zur übergabe von Variablen zwischen javascript-Funktionen ohne: zurückgeben von Variablen, Parameterübergabe zwischen primären Funktionen, Globale Variablen, und zwingt die Funktion 1 zu warten, für Funktion 2 zu beenden. Ich fand heraus, eine jQuery-Lösung und erzielte in der unten (im Abschnitt Antwort).
Alten Post: ich Initialisiere einen Satz von vier Funktionen, jede Berufung auf jedes andere in einer anderen Weise. Am Ende der es, ich brauche die final-modifiziertes Produkt (ein array) zurückgegeben, um die Initialisierung der Funktion.
Globale Variablen nicht zwingen, die ursprüngliche Funktion zu warten. Und wieder rückwärts, die vier mal nicht funktioniert entweder. Wie vertreibt man eine modifizierte variable zurück zu seiner Initialisierungsfunktion, wenn Sie nicht mehr zurück können? Oder warum ist es nicht zurückgeben?
(das Labyrinth beginnt bei initFunctionA
endet functionD
)
classOne = {
initFunctionA : function() {
classTwo.functionB(functionD, array);
//I NEED ACCESS TO ARRAY2 HERE
},
functionD : function(data, array) {
var array2 = //modifications to array
}
}
{...}
classTwo = {
functionB : function(callback, array) {
$.ajax({
success: function(ret){
classTwo.functionC(ret, callback, array)
}
});
},
functionC : function(ret, callback, array) {
callback(ret.data.x, array);
}
}
Dass der code wirklich keinen Sinn;
classTwo.function(functionB, array)
im besonderen. Werden Sie sagen, dass Sie gehen zu call functionB es?du hast Recht. sorry. Ich erstelle ein array (array2) in meiner letzten Funktion mit dem ersten array. Ich habe versucht, einfach zu sagen: array = array2 an das Ende von allem, aber es funktioniert immer noch nicht. Es ist die Rückgabe der Daten, bevor Sie die änderungen (initFunctionA geht ohne Wartezeit). Der code ist ziemlich lang. Ich machte änderungen vor, obwohl es ja hoffentlich klarer. Vielen Dank für Ihre Hilfe!
yep, ich rufe functionB es.
InformationsquelleAutor Kyle | 2010-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern Sie Ihre callback (an der call-site), so dass Sie capture die return-Wert
functionD
. Ändern Sie dannfunctionD
so, es gibtarray2
. Ich habethis
Zugriff auf das Beispiel unten als Bequemlichkeit. (Auch, sicher sein, um Semikolons, wo "erforderlich", wenn Sie wollen JSLint glücklich.)Kannst du dein code? Sind Sie sicher, dass Sie zurückgeben
array2
imfunctionD
? Sind Sie sicher, dass Sie schreiben Ihren code, welcher aufarray2
in der anonymen Funktion ininitFunctionA
und nicht in der Außenwelt, die anonym Funktion?Ich habe versucht es und dann habe ich meine änderungen rückgängig gemacht. Verzeihen Sie mir für das posting der code (ich bin auf einen Termin und gehen mit meinem hacky Lösung). ABER...ich habe viel gelernt von Ihrem Ansatz. Ich ging array2 zusammen mit verschiedenen anderen Parametern und kann ich noch nicht verstanden, die Nuancen gehen mit mehr als nur einer. That being said, +1 und prüfen. Ich denke, das wird helfen, jemand anderes für Sie sicher.
Wie ich es verstehe, werden Sie sagen, dass eine lokale variable, Funktion X ist erhältlich für die Verwendung innerhalb der Funktion werden die Funktion X, wenn auch nicht als argument übergeben? (var selbst definiert ist, in NOR, die fordert, functionB der sich selbst in seiner Funktion definition, ohne selbst als einen parameter in der functionB nennen) Hab ich das aufgeschnappt Recht?
InformationsquelleAutor strager
Können Sie nicht machen es mit einem Muster wie du geschrieben hast, es ist einfach nicht möglich, in Javascript, denn es gibt keine solche Sache als "warten". Ihre ajax-code hat zu einer callback-parameter (die du hast, obwohl es nicht klar ist, Woher es kommt oder was es macht), und dass die erste Funktion übergeben sollte im code zu tun, was Sie brauchen, mit der das array nach dem ajax-Aufruf beendet ist.
InformationsquelleAutor Pointy
Ich würde die Verwendung eines Objekts Konstruktor:
Ich sehen, warum Sie waren verwirrt. Ich hatte mein alphabet gekreuzt 🙂 ich reparierte die Buchstaben. @ChaosPandion ... ich komme zurück zu diesem morgen und versuchen Ihre Lösung.
+1 ich habe nie, dieses heraus zu testen, denn ich brauchte, um meine Klassen statische und organisiert, wie der rest des Projekts ist. Es könnte funktionieren, oder es kann die leiden, die Probleme, die Spitzen gebracht. Ich bin nicht Experte genug, um zu wissen. Ich löste mein problem in einem anderen Weg (was ich unten geschrieben)...aber +1 weil dies kann eine vollständig gültige Lösung und es sieht aus wie es könnte genau das tun, was Sie sagen.
InformationsquelleAutor ChaosPandion
Dies ist, wie ich dein problem verstanden:
classTwo Griffe eine AJAX-aufrufen und verändern können, das Ergebnis. classOne nutzt classTwo, um einige Daten und muss die daraus resultierenden Daten.
Wenn ja, wie ist das:
So classOne.initFunctionA Anrufe classTwo.functionB setzt einen ajax-Aufruf. Wenn der ajax-Aufruf erfolgreich abgeschlossen wurde, classTwo.functionC genannt wird, mit dem Ergebnis und dem ersten array. Von hier aus classOne.functionD genannt wird mit ret.Daten.x und das array.
Du bist nicht in der Lage sein, das zu tun. Die Lösung ist, verschieben Sie alle den code aus initFunctionA, die sich auf array2 in functionD. Es verhält sich wie die Funktion wurde aufgeteilt in zwei Teile mit einer Verzögerung in der Mitte (bedingt durch ajax).
Stimmt, @Matt. Obwohl ich nur eine Lösung gefunden, die es tut. Unten gebucht.
InformationsquelleAutor Matt
Okay! Ich fand einen Weg zur übergabe von Variablen zwischen Funktionen ohne:
Diese drei waren die hier vorgeschlagen werden, als die einzigen Möglichkeiten.
Zugriff auf Variablen aus anderen Funktionen, ohne die Verwendung von globalen Variablen
Aber, wenn Sie Sie nicht passieren können Parameter direkt, und Sie müssen eine Funktion auf die anderen zu warten (ich.e, kann sich nicht darauf verlassen, Referenzen), und Sie sind mit asynchronen aufrufen auf dem server in einer intermediären Funktion, dann Ihre einzige Lösung ist:
Mithilfe von jQuery...
Erstellen Sie dieses Objekt in der DOM (dynamisch, wenn Sie nicht wollen, zu matschig markup):
Dann in der Funktion, die warten muss:
Sowie in der Funktion warten:
Im wesentlichen umhüllen die letzten Aktionen, die Sie ausführen müssen, in ein jQuery-bind benutzerdefiniertes Ereignis auf einen unsichtbaren DOM-Objekt. Trigger-event von JS mit jQuery triggerHandler. Die Parameter übergeben und voila!
Ich bin sicher, SO wird mir Mist für diese (und für narzisstisch die Annahme meiner eigenen Antwort), aber ich denke, es ist ziemlich genial für eine uber-Neuling und es funktionierte für mich.
So :p-Stack Overflow
(jk, Sie alle haben mir den Arsch gerettet viele Male und ich Liebe Sie alle 🙂
window
im browser).Die Einschränkung auf Globale Variablen, die als Lösung für die controlling-Funktion, um (zum Beispiel, wenn ajax verwendet wird), ist, dass die 2. (3., 4.) Funktion führt seine Operationen auf einer Variablen, während die 1. Funktion wird fortgesetzt. Aber ich Stimme mit Ihnen konzeptionell. Es ist nur, dass die globals nicht lösen mein asynchrone problem. Diese tut. (obwohl ich sah nur Ihre post, lassen Sie mich überprüfen Sie es heraus)
auch, und .unbind() vor .bind (...), wenn der Benutzer ist in der Lage, um zurückzukehren, dass die Seite wieder.
Das ist wirklich nicht anders als Deklaration einer globalen Funktion und Aufruf über die ajax-completion-handler. Wahrlich, nicht anders: der DOM selbst ist global, so eine Funktion gebunden, wie ein Ereignis-handler von globalen Auswirkungen. Sie erreichen eine Ebene der Dereferenzierung als auslösendes Umwelt muss nicht wissen, welche Funktion tatsächlich ausgeführt, aber Sie würde sich genau die gleiche Wirkung durch eine Globale variable zu verweisen, um die eigentliche Funktion. Natürlich den Aufruf einer globalen Funktion direkt ist schneller als ein benutzerdefiniertes Ereignis aus, zu.
wenn ich Globale Variablen verwenden, meine erste Funktion ausgeführt wird, ohne "warten." Das auslösen eines Ereignisses von ajax-Erfolg bedeutet, dass die Funktion, die aufgerufen durch ajax wird nicht ausgelöst, bis es durch, aber, dass die aufgerufene Funktion nicht, die ich brauche, um zu warten. Ich Schätze Ihre Einsicht, sondern die beiden Methoden ergab sehr unterschiedliche Ergebnisse für mich.
InformationsquelleAutor Kyle