2012-08-08 46 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