2012-04-05 5 views
2

richtigen Werte hatte ich habe eine Funktion, die den höchsten Wert eines Attributs in einer XML-Datei, um den Wert zurückgibt unterJavascript-Funktion gibt immer einen falschen Wert, obwohl Variable vor

Der Rückgabewert ist immer 0, so dass ich denke, das Die JQuery-Funktion weiß nicht, was in ihr passiert. Hier ist die Funktion:

function findHighestValue(url,attr){ 
var highestValue = 0; 
$.ajax({ 
    type: "GET", 
    url: url, 
    dataType: "xml", 
    success: function(xml) { 
     $(xml).find("achievement").each(function(){ 
      var value = $(this).find(attr).text(); 
      value = value*1;//typecast 
      console.log("value: "+value);//shows correct value 
      console.log("highestValue in ajax: "+highestValue);//shows correct value 
      if (value >= highestValue){ 
       highestValue = value; 
       console.log("Value higher highesValue detected!");//works as intended 
      } 

     }); 
    } 
}); 
console.log("Highest Value: "+highestValue);// is 0 again 
return highestValue;//always returns 0 
} 

Antwort

6

Da es sich um eine Ajax-Anfrage handelt, werden die letzten beiden Zeilen vor den Zeilen innerhalb der Erfolgsmethode getroffen.

Sie können einen Wert von einer Ajax-Anforderung zurück, wenn Sie async: false

Sie müssen eingestellt eher den Wert über den Erfolg Rückruf verarbeiten, als es zurückzubringen versucht.

+0

Ich habe meine Lektion gelernt, es macht völlig Sinn. Ich setze den Async auf false und jetzt funktioniert es wie geplant. Vielen Dank! – dan

+0

@dan Ich rate jedoch davon ab, async auf false zu setzen, da dies den Browser einfriert, wenn Ihre Ajax-Anfrage lange dauert. Viel besser, die Callback-Funktion zu verwenden, um Ihre Logik auszuführen. –

+0

Ich stimme zu, ich werde es beheben. – dan

2

AJAX ist asynchronous, so ist es nicht für Ihre $.ajax() Anruf warten, bevor console.log(), daher der falsche Wert aufrufen. So dass Sie sich in dem Sinne, dass doesnt know what happens inside of it

Um dies zu bewältigen, können Sie entweder platzieren Sie den Rest Ihrer Funktion der Logik innerhalb success Eigenschaft Ihres $.ajax Anruf oder async: false gesetzt, aber gewarnt werden, dass Ihr Browser „einzufrieren“ ein bisschen wird wenn $.ajax() passiert

+0

danke für die Info – dan

Verwandte Themen