2013-02-06 43 views
-1

我打算收集使用PHP数据,但暂时我是来自一个htm文件检索数据:代码如下:如何阻止程序的进一步执行,直到事件在as3中完成为止?

var Data:String; 
Data=getData("file:///C:/..../try.htm"); 
trace(Data); 

function getData(url:String):String 
{ 

    var phpFileRequest:URLRequest = new URLRequest(url); 
    var phpLoader:URLLoader = new URLLoader(); 
    phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 

    phpLoader.addEventListener(Event.COMPLETE, showResult); 
    phpLoader.load(phpFileRequest); 
    var a:int=1; 
    trace("Worked"); 


    function showResult (event:Event):void 
    { 

     import flash.text.*; 
     Data= "" + event.target.data.systemResult; 
     trace(Data); 


    } 
return Data; 
} 

眼下函数调用执行,增加了事件监听器,然后返回到主代码并尝试跟踪变量Data,结果为null,稍后在事件完成时执行该函数。我想要的是程序控件只有在事件完成并且showResult()已经执行后才会返回。请帮忙

+1

看起来你似乎试图同步加载你的数据。我不认为这是可以完成的,所以我建议改变一下你的代码,这取决于你打算做什么。 – mitim

回答

0

在As3.0中只使用while()循环等待函数。

看到下面的帖子。

Action Script Sleep function

AS3-sleep-function

令人遗憾的是没有的ActionScript/Flash并没有一个类似的睡眠功能。

而且我建议下面的代码更改代码。

var Data:String; 
getData("file:///C:/..../try.htm"); 

this.addEventListener("received", receivedHandler); 
var isReceived:Boolean = false; 
function receivedHandler(e:Event):void 
{ 
    isReceived = true; 
    trace("Data: ", Data); 
    //do stuff 
} 

function getData(url:String):void 
{ 

    var phpFileRequest:URLRequest = new URLRequest(url); 
    var phpLoader:URLLoader = new URLLoader(); 
    phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 

    phpLoader.addEventListener(Event.COMPLETE, showResult); 
    phpLoader.load(phpFileRequest); 
    var a:int=1; 
    trace("Worked"); 

    function showResult (event:Event):void 
    { 
     import flash.text.*; 
     Data= "" + event.target.data.systemResult; 
     dispatchEvent(new Event("received")); 
    } 
} 
+0

当它处于等待循环时,会导致100%的CPU使用率。如果你在循环中做一个“sleep(1)”,它会好很多,但它仍然是一个理想的解决方案。如果_data从未设置为任何内容会怎么样?那么如果在检查时某个特定点上只有部分数据呢? – GordonM

+0

@ bitmapdata.com:对不起,这可能听起来很愚蠢,但我还没有找到一个适当的等待逻辑呢:(有什么建议吗? – user2043188

+0

为什么要投票吗?你知名的as3.0?这篇文章http://stackoverflow.com/questions/3009929/action-script-sleep-function也可以在as3.0中使用while循环只使用while循环其他方法不可用 –

1

您不能在Flash中进行同步下载。为了等待事件而不使用处理能力,请使用输入帧侦听器和一个标志。举个例子:

var Data:String; 
var weAreReady:Boolean=false; 
getData("file:///C:/..../try.htm"); 
addEventListener(Event.ENTER_FRAME,enterFrame); 

function getData(url:String):void 
{ 

var phpFileRequest:URLRequest = new URLRequest(url); 
var phpLoader:URLLoader = new URLLoader(); 
phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 

phpLoader.addEventListener(Event.COMPLETE, showResult); 
phpLoader.load(phpFileRequest); 
} 

function showResult(event:Event):void 
{ 
    import flash.text.*; 
    Data= "" + event.target.data.systemResult; 
    trace(Data); 
    weAreReady=true; 
} 
function enterFrame(e:Event):void { 
    if (weAreReady) { 
     removeEventListener(Event.ENTER_FRAME, enterFrame); 
     goFurther(); // this will be called when the data will be finally ready 
    } 
} 
1

我只是想给Vesper的答案增加点什么。使用EnterFrame没有意义,因为事件正在完成相同的工作。等待事件在你做任何事情之前被触发。

var Data:String; 
var weAreReady:Boolean=false; 
getData("file:///C:/..../try.htm"); 

function getData(url:String):void 
{ 

var phpFileRequest:URLRequest = new URLRequest(url); 
var phpLoader:URLLoader = new URLLoader(); 
phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 

phpLoader.addEventListener(Event.COMPLETE, showResult); 
phpLoader.load(phpFileRequest); 
} 

function showResult(event:Event):void 
{ 
    Data= "" + event.target.data; 
    trace(Data); 
    goFurther(); // this will be called when the data will be finally ready 
} 

如果你想打电话,同时不同的请求,并希望等待所有的事件被触发,从而避免再次添加enterFrame事件或定时器的组合。首先,我会避免多个同时发生的请求,并将它们排队,似乎更好的方法来控制整个事情。但在这种情况下,无论如何你都愿意这样做,我会这样写:

var Data:String; 
var _total:int; //number of events 
var _done:int; //number of events triggered 
var weAreReady:Boolean=false; 
_total = 4; 
_done = 0; 

getData("file:///C:/..../try.htm"); 
getData("file:///C:/..../try2.htm"); 
getData("file:///C:/..../try3.htm"); 
getData("file:///C:/..../try4.htm"); 

function getData(url:String):void 
{ 

var phpFileRequest:URLRequest = new URLRequest(url); 
var phpLoader:URLLoader = new URLLoader(); 
phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 

phpLoader.addEventListener(Event.COMPLETE, showResult); 
phpLoader.load(phpFileRequest); 
} 

function showResult(event:Event):void 
{ 
    Data= "" + event.target.data; 
    trace(Data); 
    if(++_done == _total) goFurther(); // this will only be called when all the events have been triggered 
} 
+0

嗯。在这种情况下,它确实足够了,但是如果您在等待多个标志在相应的加载器中设置,则可能需要输入帧监听器。谢谢,宝贵的补充。 – Vesper

相关问题