2012-02-25 4 views
1

downloadURL()の外部に目的のmlengthを下のコードで出力する方法はありますか?どうやって?AJAX変数スコープ

var markers=new Array(); 
var mlength=0; 
downloadUrl("phpsqlajax_genxml.php", function(data) { 
    var xml = data.responseXML; 
    markers = xml.documentElement.getElementsByTagName("marker"); 
    mlength = markers.length; 
    alert(mlength); //output is not 0 (ex. 3) 
}); 
alert(mlength); //outputs 0 

答えて

7

これは、定義上、AJAXは非同期であるためです。 alertが実行されるまでに、AJAX呼び出しはまだ返されていません。成功コールバック内にmlengthを使用しているコードを移動する必要があります。

もう1つの選択肢は、AJAXリクエストを同期させることですが、通常は応答が受信されるまでブラウザをロックする傾向があるため、これは必要ではありません。

+1

+1を(彼は取るべきではないとオプション) –

+0

は素敵な説明をありがとうは...今私は – Jed

+0

@JedLlenadoを理解していない - いいえ、問題を、 お役に立てて嬉しいです :) –

1

単純な回答ではありません。私はdownloadUrlが非同期で、あなたがこれを制御できないと仮定しています(これは、あなたが提供したコールバックの前に警告が発生していることを意味します)。

出力が本当に必要な場合は(これを強くお勧めします)。あなたはこれを行うことができます。

var markers=new Array(); 
var mlength=0; 
var req = new XMLHttpRequest(); 
req.open("phpsqlajax_genxml.php", false); 
req.send(); 
var xml = req.responseXML; 
markers = xml.documentElement.getElementsByTagName("marker"); 
mlength = markers.length; 
alert(mlength); //output is not 0 (ex. 3) 

これは、汚れたコードです。

1

XHRコールバック以外でXHRのmlengthを使用する場合は、値があるまで待つ必要があります。あなたはタイムアウト機能使用していることを行うことができます。私はコード化されたものを説明するための

var markers = [] 
    ,mlength = null 
    ,showresult = function() { 
     if (mlength === null) { //=> no value, wait another 100 ms 
     setTimeout(showresult,100); 
     } else {    //=> there it is, alert it 
     alert(mlength); 
     } 
    }; 

downloadUrl("phpsqlajax_genxml.php", function(data) { 
    var xml = data.responseXML; 
    markers = xml.documentElement.getElementsByTagName("marker"); 
    mlength = markers.length; 
}); 

setTimeout(showresult,100);