Peter K.: Callback - Probleme mit Return-Value

Guten Tag Forum,

ich habe ein Verständnisproblem hinsichtlich der Implementierung einer korrekten Callback-Funktion.

Und zwar nutze ich folgendes JQuery-Plugin
http://tomcoote.co.uk/jQueryJSONSuggestBox.aspx

Ich möchte die Daten via AJAX-Request abholen.
Dazu habe ich folgenden Code erstellt:

$("#input_search_suggest").jsonSuggest(  
				function(text, wildCard, caseSensitive, notCharacter)  
				{  
					var res = $.postJSON("/sources/ajax/suggest_search.ajax","");  
					var resultList = res.responseText;  
					return resultList;  
				},  
				{  
					ajaxResults:true  
				}  
			); 

Natürlich ist zu dem Zeitpunkt (res.responseText) nicht gewährleistet, dass das Result bereits angekommen ist.
Doch nutze ich an dieser Stelle eine Callback-Funktion

$("#input_search_suggest").jsonSuggest(  
				function(text, wildCard, caseSensitive, notCharacter)  
				{  
					var res = $.postJSON("/sources/ajax/suggest_search.ajax","", function(data) { return data });  
				},  
				{  
					ajaxResults:true  
				}  
			); 

so bezieht sich das Return ja schließlich nur auf die Callback-Funktion, die "darüber liegende" Funktion bekommt davon ja nichts mit.

So, wie kann ich hier vorgehen, so dass tatsächlich die korrekten Daten zurückgeliefert werden?
Das setzen einer Variable des äußeren Scopes brachte mir auch kein brauchbares Ergebnis.

Vielen Dank schonmal.

Peter K.

  1. So, wie kann ich hier vorgehen, so dass tatsächlich die korrekten Daten zurückgeliefert werden?

    In dem du in der callback Methode auf den Wert zugreifst. Du musst dich bei AJAX lösen von der Vorstellung eines linearen Programmablauf. Das erste A steht für asynchron.

    Struppi.

    1. Hallo Struppi,

      vielen Dank für deine Antwort. Aber so ganz verstehe ich das noch nicht.

      In dem du in der callback Methode auf den Wert zugreifst.

      Um welchen Wert handelt es sich hier? Ich muss ja nicht aus der Callback-Methode auf einen Wert zugreifen, sondern an die überliegende Funktion den Rückgabewert der Callback-Methode übermitteln.

      Wie ich dich jetzt verstanden habe:

      function(text, wildCard, caseSensitive, notCharacter)  
      				{  
      					var ret;  
      					$.postJSON("/sources/ajax/suggest_search.ajax","", function(data)  
      						{  
      							ret = data;  
      						}  
      					);  
      					return ret;  
      				},  
      				{  
      					ajaxResults:true  
      				}
      

      Aber hierbei liefert die Methode (das verstehe ich sogar) immer einen leeren Wert zurück.

      Nochmal besten Dank im Voraus.
      MfG
      Peter

      1. Mahlzeit Peter K.,

        In dem du in der callback Methode auf den Wert zugreifst.
        Um welchen Wert handelt es sich hier? Ich muss ja nicht aus der Callback-Methode auf einen Wert zugreifen, sondern an die überliegende Funktion den Rückgabewert der Callback-Methode übermitteln.

        Aber das *kannst* Du doch gar nicht, wenn die Callback-Methode erst "viel später" (nämlich wenn die Response auf den von Dir abgesetzten Request zurückkommt) aufgerufen und abgearbeitet wird.

        Ich wiederhole Struppis auf die *Asynchronität* der Vorgänge und Ereignisse ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hallo Ekki,

          Aber das *kannst* Du doch gar nicht

          OK, das wurde mir nun auch bewusst (habe nur ein bißchen gebraucht ;-).

          Sprich, wenn ich das über die eigentliche Low-Level Funktion $.ajax realisiere, und dort async auf false stelle, dann erreiche ich das erwünschte Resultat.

          var test  = $.ajax({  
           type: 'GET',  
           url: '/sources/ajax/suggest_search.ajax',  
           dataType: 'json',  
           success: function() { },  
           data: {},  
           async: false  
          });  
          return test.responseText;
          

          Kann ich das so einfach machen oder kann es hierbei zu anderen Problemen kommen?

          MfG
          Peter

          1. Kann ich das so einfach machen oder kann es hierbei zu anderen Problemen kommen?

            Es ist insofern problematisch, dass wenn der Server einmal hakt, das Skript solange warten muss bis der Server endlich antwortet oder es durch einen Timeout beendet wird. Aber auch im normalen Betrieb kann es immer mal wieder vorkommen, dass der Browser durch dein Skript dann für einige Zeit völlig blockiert wird. Wenn du das deinen Besuchern zumuten kannst und willst, ist das ok. Üblicherweise wird es aber nicht so gemacht (deshalb heißt es ja auch AJAX)

            Struppi.

            1. Hallo,

              OK, vielen Dank für eure Hilfe !

              MfG
              Peter K.

          2. Moin!

            Aber das *kannst* Du doch gar nicht
            OK, das wurde mir nun auch bewusst (habe nur ein bißchen gebraucht ;-).

            Sprich, wenn ich das über die eigentliche Low-Level Funktion $.ajax realisiere, und dort async auf false stelle, dann erreiche ich das erwünschte Resultat.

            Nicht wirklich. Dazu ist die Callback-Funktion doch da, dass sie mit dem Ajax-Resultat irgendwelche sinnvollen Dinge anstellt (z.B. die Darstellung des Ergebnisses in der Seite regelt).

            Sprich: Du startest den Ajax-Aufruf in einer Funktion, und das Ergebnis des Ajax verarbeitest du im Success-Callback wie gewünscht. Closures sorgen dafür, dass du im Callback noch auf Variablenwerte zugreifen kannst, die die startende Funktion definiert hat. Heißt: Wenn ein Wert dir in der Callback-Funktion nicht mehr zur Verfügung steht, kopiere ihn in eine zur aufrufenden Funktion lokalen Variable.

            - Sven Rautenberg