Ralf: Array aus Objekten zurück geben

Hallo,

ich habe folgende Funtion:

  
  
var myList = getList();  
//Ausgabe "undefined"  
alert(myList);  
  
  
function getList(){  
	$.ajax({  
	        type: "GET",  
                url: "test.php",  
                data: "action=getOrderList&date=2013-03-31",  
                success: function(data){  
			var json = $.parseJSON(data);  
			alert(json);  
			return json;  
	        }  
            });  
    }  
  

Der ajax Teil scheint zu funktionieren. Das zuerst aufgerufenen alert (innerhalb der Funktion) gibt "[object Object], [object Object], [object Object]..." aus, das andere "undefined".
Was mache ich falsch?

Gruß
Ralf

  1. Hallo Ralf,

    Was mache ich falsch?

    Ajax läuft asyncron. Du musst die Verarbeitung der gelesenen Daten in die Callback-Funktion "success" legen. Ein "return" bringt da nichts.

    Gruß, Jürgen

  2. Moin,

    Was mache ich falsch?

    du verlierst den Überblick über den zeitlichen Ablauf sowie die Übergabe von Daten.

    var myList = getList();

    //Ausgabe "undefined"
    alert(myList);

      
    Deine Funktion getList() setzt einen asynchronen HTTP-Request ab und kehrt dann sofort wieder zurück. In dem Moment, wo das alert() ausgeführt wird, ist die Antwort vom noch lange nicht eingetroffen.  
      
    Und selbst wenn sie es wäre: getList() selbst gibt nichts zurück, myList bleibt also undefined. Denn \_wenn\_ endlich die sehnlich erwartete Antwort vom Server kommt, dann ...  
      
    
    > ~~~javascript
    
    function getList(){  
    
    > 	$.ajax({  
    > 	        type: "GET",  
    >                 url: "test.php",  
    >                 data: "action=getOrderList&date=2013-03-31",  
    >                 success: function(data){  
    > 			var json = $.parseJSON(data);  
    > 			alert(json);  
    > 			return json;  
    > 	        }  
    >             });  
    >     }
    
    

    ... wird zwar die Callback-Funktion data() innerhalb des AJAX-Objekts aufgerufen - aber was macht die mit den Daten? Analysieren, umwandeln, mit alert() anzeigen, und dann mit return zurückgeben. Und an wen? Diese Funktion wird als Callback asynchron aufgerufen wie ein klassischer JS-Eventhandler, ein Funktionsergebnis ist hier nicht vorgesehen.

    Der ajax Teil scheint zu funktionieren. Das zuerst aufgerufenen alert (innerhalb der Funktion) gibt "[object Object], [object Object], [object Object]..." aus, das andere "undefined".

    In dieser Reihenfolge?? Ich hätte es umgekehrt erwartet. Das würde ja darauf hindeuten, dass dein AJAX-Request doch synchron abläuft. Bleibt aber immer noch das Problem, dass die empfangenen Daten (json) im Callback nicht aus der Funktion getList() zurückgeliefert werden.

    Ciao,
     Martin

    --
    Niemand ist überflüssig: Er kann immer noch als schlechtes Beispiel dienen.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. [latex]Mae  govannen![/latex]

      Das würde ja darauf hindeuten, dass dein AJAX-Request doch synchron abläuft.

      Das ist nicht möglich.

      Stur lächeln und winken, Männer!
      Kai

      --
      var jQuery = $(hit);
      I am Pentium of Borg. Division is futile. You will be approximated.
      SelfHTML-Forum-Stylesheet
      1. Hallo Kai345,

        Das würde ja darauf hindeuten, dass dein AJAX-Request doch synchron abläuft.

        Das ist nicht möglich.

        warum nicht?

        Gruß, Jürgen

        1. [latex]Mae  govannen![/latex]

          Das würde ja darauf hindeuten, dass dein AJAX-Request doch synchron abläuft.

          Das ist nicht möglich.

          warum nicht?

          *A*JAX _kann_ niemals synchron ablaufen.

          Einen XMLHTTPRequest generell als „AJAX“ zu bezeichnen, ist ebenso falsch wie Elemente als „Tags“ zu bezeichnen oder Javascript als Java.. Aus diesem Grunde hasse (nicht nur) ich diese Bezeichnung auch.

          Außerdem ist „XHR“ volle 25% kürzer ;)

          Stur lächeln und winken, Männer!
          Kai

          --
          var jQuery = $(hit);
          „Die Borg würden nicht mal Spaß verstehen, wenn sie einen Vergnügungspark assimiliert hätten!” (B'Elanna Torres)
          SelfHTML-Forum-Stylesheet
          1. Hallo,

            Das würde ja darauf hindeuten, dass dein AJAX-Request doch synchron abläuft.
            *A*JAX _kann_ niemals synchron ablaufen.

            stimmt, dass wäre ein Paradoxon, quasi ein heißes Schokoladeneis.

            Einen XMLHTTPRequest generell als „AJAX“ zu bezeichnen, ist ebenso falsch wie Elemente als „Tags“ zu bezeichnen oder Javascript als Java.. Aus diesem Grunde hasse (nicht nur) ich diese Bezeichnung auch.

            Einverstanden. Aber wenigstens kam trotzdem rüber, was ich eigentlich gemeint hatte.

            Ciao,
             Martin

            --
            Der Dienstweg ist die Abkürzung vom Holzweg zur Sackgasse.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Hi,
    Du könntest die Json-Werte einfach in eine globale Variable speichern.
    Du musst allerdings bei der Verarbeitung dieser achten geben, da Ajax ja bekanntermaßen asynchron läd.

    Könnte bspw. so aussehen, orientiere mich mal nahe an deinem Code.

      
      
    var myList;  
      
    var machwas = function(data){  
    	//Verarbeitung der json Daten  
    	//What ever...  
    	  
    	myList = $.parseJSON(data);  
    	  
    	//Weitere Verarbeitung  
    	//...  
    	  
    	alert(myList);  
    }  
      
    function getList(){  
     	$.ajax({  
     	        type: "GET",  
                     url: "test.php",  
                     data: "action=getOrderList&date=2013-03-31",  
                     success: function(data){  
     			machwas(data);  
     	        }  
                 });  
    }  
      
    getList();  
      
    
    

    Die Definition und der Aufruf der machwas-Funktion in der Callbackfunktion dient der Übersichtlichkeit. Du kannst natürlich auch alles direkt in die Callbackfunction schreiben, ohne Umweg über die machwas Funktion.

    1. Hi,
      Du könntest die Json-Werte einfach in eine globale Variable speichern.
      Du musst allerdings bei der Verarbeitung dieser achten geben, da Ajax ja bekanntermaßen asynchron läd.

      Das ist aus einigen gründen nicht empfehlenswert.

        
        
      function getList(callback){  
        $.ajax({  
          type: "GET",  
          url: "test.php",  
          data: "action=getOrderList&date=2013-03-31",  
          success: function(data){  
            callback.call(data);  
          }  
         });  
       }  
        
      getList(function(data){ alert($.parseJSON(data)); });  
      
      

      Ungetestet, das ist aber die idee.

      Ich gebe zu ich stand mal vor der selben blockade. Der AHA moment war umso besser ;)

      Mfg entropie

      --
      Whenever people agree with me I always feel I must be wrong.
        -- Oscar Wilde