解决as3在与外部脚本交互过程中的数据异步的几种方案
Kuma post in [About Codes]
2010-2-3 9:22 Wednesday
在写生活博客系统的as代码的时候,遇到了这个数据异步的问题,当时很恼火于as3的这种机制。不过后来在研究的时候还是想到了3种解决方案,两种as内部解决方案和一种结合外部脚本的解决方案。
先贴上一个会出现数据异步的代码例子:
function checkAdmin(admins:String, passwords:String):Boolean {
phpApiPostObject = new URLVariables;
phpApiUrlLoader = new URLLoader();
phpApiUrlRequest = new URLRequest("http://localhost/swfapi.php");
phpApiUrlRequest.method = "post";
phpApiUrlRequest.data = phpApiPostObject;
phpApiPostObject.admin = admins;
phpApiPostObject.password = passwords;
phpApiUrlLoader.load(phpApiUrlRequest);
phpApiUrlLoader.addEventListener(Event.COMPLETE, phpApiUrlLoaderComplete);
function phpApiUrlLoaderComplete(e:Event):void
{
returnData = e.target.data;
}
if(returnData == "true"){return true }else{return false };
}
如上面代码所示,我的目的是要往该函数传入2个参数,然后函数将这两个参数发送到php端,php端接收到参数后处理,函数然后读取处理结果,再将结果返回一个布尔值回来。但是该函数将永恒返回false,原因是
flash的运作机制与php不同,它不会在COMPLETE事件执行后才执行下面的代码,而是将COMPLETE事件和下面的时间同时执行。
那么如何解决上面的问题呢?我们可以通过增加一个function类型的参数传入函数,以监听complete事件。代码如下:
function checkAdmin(admins:String, passwords:String,fun:Function):Boolean {
phpApiPostObject = new URLVariables;
phpApiUrlLoader = new URLLoader();
phpApiUrlRequest = new URLRequest("http://localhost/swfapi.php");
phpApiUrlRequest.method = "post";
phpApiUrlRequest.data = phpApiPostObject;
phpApiPostObject.admin = admins;
phpApiPostObject.password = passwords;
phpApiUrlLoader.load(phpApiUrlRequest);
phpApiUrlLoader.addEventListener(Event.COMPLETE, phpApiUrlLoaderComplete);
function phpApiUrlLoaderComplete(e:Event):void
{
returnData = e.target.data;
fun(returnData);
}
}
function fun(s:String):Boolean{
if(s=="true"){
return true;
}else{
return false;
}
}
如上所示,你在使用该函数的时候,可以通过传入一个function来处理返回结果。
除了如上方法,还可以使用下面两种思想解决数据异步问题:
1.自定义广播事件:以上面的函数为例,可以在complete事件里面定义一个EventDispitcher提供给外部程序监听,然后再调用函数里面的returnData的值。
2.结合脚本,当PHP端处理完数据后,用JS回调flash。
这是我总结的3种解决数据异步的方法,希望对大家有所帮助。
回乡下了,远离网络10几天
回到忠县了

还可以收缩??
云里雾里都分不清了……
老爸是个工作狂啊工作狂
转转走了,不用送了……