ebody: JQuery - Kann nicht auf Variable in verschachtelter Funktionen zugreifen

Hallo,

das ist der Code:

var test1000 = function (){

	return wasBinich = tests();
	
		$.get("datei.html", 

			function tests (data){
			
				var innen = "Innere Werte";
				return innen;
			
			}
							
		);
	
}

console.log("test1000: " + test1000());

Damit bekomme ich keinen Wert zurück. Ich habe auch schon sehr viele andere Varianten ausprobiert. Ich bekomme nur den Wert, wenn ich $.get auskommentiere.

var test1000 = function (){

	return wasBinich = tests();
	
		//$.get("datei.html", 

			function tests (data){
			
				var innen = "Innere Werte";
				return innen;
			
			}
							
		//);
	
}

console.log("test1000: " + test1000());

Wie bekomme ich den Wert mit $.get?

Gruß ebody

  1. Tach!

    var test1000 = function (){
    	return wasBinich = tests();
    	
    	$.get("datei.html", 
    			function tests (data){
    				var innen = "Innere Werte";
    				return innen;
    			}
    		);
    }
    
    console.log("test1000: " + test1000());
    

    Du kannst tests() nicht auf diese Weise aufrufen. Diese Funktion steht nur als Parameter von $.get() zur Verfügung. Ihr Name ist außerhalb nicht bekannt. Eigentlich bruacht sie auch gar keinen Namen. Jedenfalls bekommst du eine Fehlermeldung in der Konsole. Die solltest du eigentlich sehen. Im Allgemeinen sollte man beim Entwickeln im Browser und bei Javascript im Speziellen immer die Konsole geöffnet haben, damit man solche Fehlermeldungen sieht.

    Damit bekomme ich keinen Wert zurück.

    Dein Problem ist, dass du die asynchrone Arbeitsweise von $.get() und XHR-Aufrufen beachten musst. Solche Funktionen kehren sofort zurück, ohne ihre Aufgabe erledigt zu haben. Das Ergebnis kommt ja erst irgendwann, wenn der Request gesendet und die Response empfangen wurde. Erst dann wird die Callback-Funktion aufgerufen. Und nur innerhalb von dieser oder in davon aufgerufenem Code kannst du auf das Ergebnis zugreifen.

    (K)eine Alternative wäre, synchron zu arbeiten. Das ist allerdings unangenehmer für deien Besucher, weil der Browser dann blockiert. Deine Webseite lässt sich nicht bedienen, solange Request und Response noch auf dem Weg sind.

    dedlfix.

    1. @@dedlfix

      (K)eine Alternative wäre, synchron zu arbeiten. Das ist allerdings unangenehmer für deien Besucher, weil der Browser dann blockiert. Deine Webseite lässt sich nicht bedienen, solange Request und Response noch auf dem Weg sind.

      Was auch bis in alle Ewigkeit sein kann. Die Klammern um das K sollten weg. 😏

      LLAP 🖖

      --
      “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      1. Tach!

        (K)eine Alternative wäre, synchron zu arbeiten.

        Die Klammern um das K sollten weg. 😏

        Das ist eine stilistische Stolperstelle beim Lesen, um die Aufmerksamkeit darauf zu lenken, dass es eben doch keine echte Alternative ist.

        dedlfix.

        1. @@dedlfix

          (K)eine Alternative wäre, synchron zu arbeiten.

          Die Klammern um das K sollten weg. 😏

          Das ist eine stilistische Stolperstelle beim Lesen

          Schon klar. Ich mache das selbst auch gelegentlich. Gerade wieder.

          LLAP 🖖

          --
          “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
    2. Hallo,

      vielen Dank erstmal für deine Antwort.

      Du kannst tests() nicht auf diese Weise aufrufen.

      Im 2. Code den ich gepostet habe, konnte ich nur so den Wert der Variable innen in der Console ausgeben, da kommt keine Fehlermeldung, nur beim 1. Code. Die Console habe ich immer geöffnet und lasse mir den Wert über console.log("test1000: " + test1000()); ausgeben.

      Ihr Name ist außerhalb nicht bekannt. Eigentlich bruacht sie auch gar keinen Namen.

      Weil die Variable außerhalb nicht bekannt ist, suche ich einen Weg, um diese nach außen zu "übertragen". Dafür hatte ich einen Beispiel Code geschrieben und rum probiert. Ich habe es nur mit diesem Code geschafft, die Variablen Werte der innersten Funktion bis in die höchste Ebene zu übertragen.

      function getName() {
      //console.log("start Funktion:" + strName);
          
      	var strName;
      		
      		return function() {
      		//console.log("1. Funktion:" + strName);
      			
      			return strName = "Herr " + bbb();
      			
      				function bbb () {
      				//console.log("2. Funktion:" + strName);
      				
      					return strName = "Max " + ccc();
      				
      						function ccc () {
      						//console.log("3. Funktion:" + strName);
      						
      							return strName = "Mustermann";
      						
      						}
      				
      				}
      			
      		}
      	
      	return strName;
      }
      var wieIstDerName = getName();
      console.log("wieIstDerName: " + wieIstDerName());
      

      Daher habe ich in dem Code, um den es eigentlich geht den Namen tests() verwendet.

      Gruß ebody

      1. Tach!

        Weil die Variable außerhalb nicht bekannt ist, suche ich einen Weg, um diese nach außen zu "übertragen".

        Das lass mal lieber. Du könntest das machen, indem du eine globale Variable anlegst und diese dann in der Callback-Funktion befüllst. Das Problem daran ist aber, dass du anderenorts nicht weißt, ob diese Variable bereits gültigen Inhalt hat oder nicht, denn sie wird ja erst nach einer gewissen Zeit befüllt, wenn der Ajax-Request fertig ist und der Callback aufgerufen wurde. Der äußere Code müsste also immer und sicher auch wiederholt prüfen, ob er denn nun mit dem Wert arbeiten kann oder nicht.

        Damit holst du dir nur unnötige Komplexität ins Haus. Und wenn du diese Prüfung vergisst, hast du eine Fehlerstelle, die mal auftaucht und mal nicht, je nach zeitlichem Zufall, ob der Ajax-Request bereits durch ist oder nicht.

        Deswegen ist diese Idee kein gescheiter Weg. Der bessere ist die Verschachtlung, dass alles, was von diesem Ajax-Request-Ergebnis abhängig ist, in diesem Callback stattfindet oder in Code, der daraus aufgerufen wird.

        Solch eine Verschachtlung ist aber auch nicht so toll, weil das den Code nur immer weiter einrückt, und so hat man die Promises erfunden. Die könenn zwar auch nicht zaubern und sind ebenfalls auf diese zeitlichen Abhängigkeiten angewiesen, aber der Code schreibt sich weniger tief geschachtelt. Darauf möchte ich grad aber nicht tiefer eingehen, das ist ein Kapitel für sich. Nur so viel: $.get() unterstützt auch diese Promise-Vorgehensweise.

        dedlfix.