Dani Düsentrieb: Mootools Request

Hallo Leute
ich habe folgenden Mootools JS Request und möchte das Ergebnis in mehreren anderen JS Funktionen verwenden. Leider ist der Rückgabewert immer undefined abwohl das alert() zuvor immer den richtigen Wert bringt. Wie muss ich es anstellen um das Ergebins des Requests weiter zu verarbeiten.

  
var get_availability = function(option){  
	var return_value;  
	var sendstring = 'herstellernummer1='+herstellernummer1+'&brandNo='+brandNo;  
	  
	var req = new Request({url:'html/avail.php',methode:'post',  
		onSuccess: function(html){  
			alert(html);  
			return_value = html;  
		}  
		onFailure: function() {  
			alert("false");  
			return_value = false;  
		}  
	});  
	req.send(sendstring);  
	  
	return return_value;  
});  

  1. Leider ist der Rückgabewert immer undefined abwohl das alert() zuvor immer den richtigen Wert bringt.

    var get_availability = function(option){
    var return_value;
    var sendstring = 'herstellernummer1='+herstellernummer1+'&brandNo='+brandNo;

    var req = new Request({url:'html/avail.php',methode:'post',
    onSuccess: function(html){
    alert(html);
    return_value = html;
    }
    onFailure: function() {
    alert("false");
    return_value = false;
    }
    });
    req.send(sendstring);

    return return_value;
    });

    Mit new Request() erzeugst du einen AJAX-Aufruf – das erste A in AJAX steht für asynchron, deine onSuccess-Routine läuft also unabhängig von der Funktion, mit der du das Request-Objekt erzeugst. Insbesondere wird es quasi unmöglich sein, dass du in einer Zeile die AJAX-Anfrage an den Server schickst (req.send(sendstring)) und dieser derart schnell antwortet, dass in der nächsten Zeile (return return_value) onSuccess ablaufen und return_value füllen konnte. Nochmal: Ab req.send() hast du _zwei_ Programmstränge, die gleichzeitig aktiv sind; der eine enthält return return_value, der andere den kompletten HTTP-Austausch mit dem Server sowie die Zeile return_value = html (und dein alert(html) zum Debuggen natürlich).

    Willst du die Antwort des Servers an andere Funktionen weitergeben, musst du diese Weitergabe in der onSuccess-Funktion direkt erledigen (nicht indirekt, wie derzeit). Wie das genau aussieht, lässt sich so nicht sagen, dazu müsste man wissen, wie du nach return return_value weiterzuarbeiten gedenkst.

    1. Die Funktion get_availability steht natürlich im domready Event. Dort selectiere ich mir dann per id ein HTML Element und rufe ne JS Function auf die mir verschiedene Events auf das Element legt. Diese Funktion soll aber gar nicht aufgerufen werden wenn der Request false zurückgibt. Im groben soll das ganze so aussehen:

        
      if($chk($('availbility_check'))){  
      	if(get_availability("text")){  
      		set_avail_check_events();  
      	}  
      }  
      
      

      Die Funktion get_availability kann auch noch mit der option image aufgerufen werden um ein Bildelement zu erstellen und das in einem HTML Element einzubetten. Wenn aber eben text als Option übergebe will ich html aus dem Request auswerten mit:

        
      if(html.contains('_none') || html.contains('_half')){  
      }  
      
      

      und dann eben nen boolean zurückgeben!

      1. Dort selektiere ich mir dann per id ein HTML-Element und rufe ne JS-Funktion auf, die mir verschiedene Events auf das Element legt. Diese Funktion soll aber gar nicht aufgerufen werden wenn der Request false zurückgibt.

        Im Moment würdest du im onSuccess-Fall quasi Folgendes machen (wenn es denn funktionieren würde, was es wegen der Asynchronität nicht tut)):

        onSuccess:
           return true;

        variable = onSuccess()
        if variable then
           funktion()

        Zusammengefasst:

        if true then
           funktion()

        Die if-Geschichte ist so gesehen vollkommen unsinnig; das Ergebnis true bzw. die Bedingung für dein if hast du bereits alleine dadurch, dass onSuccess aufgerufen wird – und deshalb gehört deine Funktion auch genau da rein, in das onSuccess-Ereignis:

        onSuccess:
           Funktion()

        Du musst nicht in onSuccess eine Extra-Variable mit true (bzw. dem HTML-Code aus dem AJAX-Aufruf) füllen, nur, um diese gleich darauf zu prüfen und die Funktion aufzurufen.

        In deinem Kontext sieht das ungefähr so aus:

        if($chk($('availbility_check'))){
        get_availability("text")
        }

        var get_availability = function(option){
                var sendstring = 'herstellernummer1='+herstellernummer1+'&brandNo='+brandNo;

        var req = new Request({url:'html/avail.php',methode:'post',
                        onSuccess: function(html){

        !!!                              if(html.contains('_none') || html.contains('_half')){
        !!!                                 set_avail_check_events();
        !!!                              }

        }
                });
                req.send(sendstring);
        });

        Der Name get_availability() ist jetzt natürlich irreführend, die Funktion holt nichts mehr, sie lässt eine Aktion im Erfolgsfall ausführen.

        1. Hi Wewe

          also ich hab mein Script mal so umgebaut und rufe jetzt die set_avail_check_events() bei onSuccess der Request auf und es klappt alles! Sehr schön vielen dank für die Unterstützung.

          Gruß Daniel