2012-08-08 50 views
0

我一直在Flash媒體服務器下爲應用程序實例獲取'null'。我似乎無法從一個函數傳遞值到另一個功能AS3在兩個函數之間連接xml中的rtmp連接字符串

XML示例

<bsettings> 
<obj title="instance">19046</owner> 
<obj title="id">uniqueid</owner> 
<obj title="name">somename</owner> 
<obj title="date">08/01/2012</owner> 
<obj title="gender">female</owner> 
</bsettings> 

AS3代碼

<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    applicationComplete="initConnection(event)"> 

private var xinstance:String; 
private var xmlstring:String = "http://www.blah.com/blahblah.xml"; 

protected function getXML():void{ 
XML.ignoreWhitespace = true; 
var myXML:XML; 
var myLoader:URLLoader=new URLLoader(); 
myLoader.load(new URLRequest(xmlstring)); 
myLoader.addEventListener(Event.COMPLETE, processXML); 

function processXML(e:Event):void { 
myXML = new XML(e.target.data); 
for (var i:int = 0; i<myXML.*.length(); i++){ 
xinstance = myXML.obj[0]; 
xblah = myXML.obj[1]; 
xblah1 = myXML.obj[2]; 
xblah2 = myXML.obj[3]; 
xblah3 = myXML.obj[4]; 
} 
} 
} 

private function initConnection(event:FlexEvent):void{ 
getXML(); 

//problem here, the xinstance isn't saved in the fmsstring 
var fmsstring:String = "rtmp://blah.com/appname/" + xinstance; 

nc = new NetConnection(); 
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
nc.connect(fmsstring); 
nc.client = this; 
} 
+0

您似乎不會聲明'xinstance'eg。私人變種xinstance:字符串。此外,您循環訪問xml列表併爲每個迭代的xinstance分配一個值。發佈你的XML文檔,我會給你一些關於如何更好地實現這一點的提示。 – BadFeelingAboutThis 2012-08-08 00:52:47

+0

我添加了XML示例數據並已聲明xinstance,但忘記將其複製過 – Patriotec 2012-08-08 01:03:47

+0

更新了我的答案,如果它不起作用請評論它。 – BadFeelingAboutThis 2012-08-08 01:11:35

回答

1

你的問題是你不等待XML加載在使用xinstance字符串之前。在調用getXML()函數的initConnection函數中 - 開始加載xml,您需要等到xml被加載後再執行initConnection函數中的其餘代碼。這裏是一個建議的更改:(我添加了被稱爲後處理xml的go()函數)

private var xinstance:String; 

protected function getXML():void { 
    var xmlstring:String = "http://www.blah.com/blahblah.xml"; 
    XML.ignoreWhitespace = true; 
    var myLoader:URLLoader=new URLLoader(); 
    myLoader.load(new URLRequest(xmlstring)); 
    myLoader.addEventListener(Event.COMPLETE, processXML); 
} 

protected function processXML(e:Event):void { 
    var myXML:XML = XML(e.target.data) 

    //THIS IS NOT A GOOD WAY TO DO THIS, use e4x 
    //for (var i:int = 0; i<myXML.*.length(); i++){ 
    //xinstance = myXML.obj[0]; 
    //xblah = myXML.obj[1]; 
    //xblah1 = myXML.obj[2]; 
    //xblah2 = myXML.obj[3]; 
    //xblah3 = myXML.obj[4]; 
    //} 

    //MUCH cleaner/easier/more efficient 
    xinstance = myXML.bsettings.obj.(@title == "instance"); 

    go(); 
} 

private function initConnection(event:FlexEvent):void{ 
    getXML(); 
} 

private function go():void { 
    var fmsstring:String = "rtmp://blah.com/appname/" + xinstance; 

    nc = new NetConnection(); 
    nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
    nc.connect(fmsstring); 
    nc.client = this; 
} 
+0

我試着用title參數處理XML,但它只能在第一個XML節點上工作。如果我使用循環遍歷XML的代碼,它完美的工作 – Patriotec 2012-08-08 02:05:27

+0

循環它將只使用最後一個 – BadFeelingAboutThis 2012-08-08 04:40:20

+0

我只是不明白爲什麼你循環整個XML集,因爲最後你只使用一個具有一個xinstance值的NetConnection。 – BadFeelingAboutThis 2012-08-08 04:42:15