2012-04-05 5 views
2

前に、正しい値を持っていたが、私は値が返されたXMLファイル内の属性の最大値を返す関数JavaScript関数は、常に常に0であるので、私は下の値を考える変数は

を持って、間違った値を返します。 JQuery関数は、内部で何が起こるかを知らない。ここでは関数は次のとおりです。

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 
} 

答えて

6

これはajaxリクエストであるため、最後の2行はsuccessメソッド内の行の前に置かれます。

あなたはあなたではなく、それを返すようにしようとするよりも、成功コールバックを経由して値を処理する必要がasync: false

を設定しない限り、あなたは、Ajaxのリクエストから値を返すことはできません。

+0

私はレッスンを学んだ、それは完全に意味があります。私は非同期をfalseに設定し、今は意図通りに動作します。ありがとうございました! – dan

+0

@dan asyncをfalseに設定することはお勧めしませんが、これは、ajaxリクエストが長時間かかる場合にブラウザをフリーズするためです。あなたのロジックを実行するためにコールバック関数を使用するほうがはるかに優れています。 –

+0

私は同意する、私はそれを修正します。 – dan

2

AJAXは、このように、それは間違った値、したがって、console.log()を呼び出す前に、あなたの$.ajax()コールを待たない、asynchronousです。ですから、doesnt know what happens inside of it

はこれに取り組むために、その右の意味であり、あなたはあなたの$.ajaxコールのsuccessプロパティ内で、あなたの関数の残りのロジックを置くか、async: falseを設定し、お使いのブラウザはビットを「凍結」することをけれども警告されることができますいずれか$.ajax()が発生したとき

+0

ありがとうございました – dan

関連する問題