Php 在as3中,如何防止在事件完成之前进一步执行程序?

Php 在as3中,如何防止在事件完成之前进一步执行程序?,php,actionscript-3,Php,Actionscript 3,我打算使用php收集数据,但目前我正在从htm文件检索数据:代码如下: 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();

我打算使用php收集数据,但目前我正在从htm文件检索数据:代码如下:

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;
}

现在执行函数调用,添加事件侦听器,然后返回主代码并尝试跟踪变量数据,结果为null,稍后当事件完成时,它执行函数。我希望程序控件仅在事件完成且showResult()已执行后返回。请使用while()循环帮助As3.0中的only wait函数

见下面的帖子

遗憾的是,ActionScript/Flash没有与sleep功能等效的功能

我建议更改代码,就像下面的代码一样

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"));
    }
}

您不能在Flash中进行同步下载。为了等待事件而不使用处理能力,请使用enterframelistener和标志。例如:

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
    }
}

我只是想在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
}

这将导致在等待循环中使用100%的CPU。如果在循环中执行
睡眠(1)
,效果会更好,但这仍然是一个理想的解决方案。如果_data从未设置为任何值呢?如果检查时只在特定点上有部分数据会怎么样?@bitmapdata.com:抱歉,这听起来可能很愚蠢,但我还没有找到合适的等待逻辑:(,有什么建议吗?为什么不投票?。你知道as3.0吗?这篇文章在as3.0中也使用while循环,但只使用while循环,其他方法不可用。修正:我一眼就没注意到这是actionscript,而不是PHP代码。然而,在循环中没有任何延迟的轮询在我使用过的几乎每种语言中都是不好的ith,因为如上所述,它通常会导致100%的CPU使用率。从我在actionscript上读到的内容来看,最好在循环中使用一个暂停时间来轮询。好的,使用事件来轮询要比忙着等待好得多。看起来你正试图同步加载数据。我认为这是不可能的,所以我建议你这样做nd根据您在.Hmm之后的计划,稍微更改您的代码。在这种情况下,这确实足够了,但如果您正在等待在各自的加载程序中设置多个标志,则可以使用enter frame侦听器。谢谢,这是一个有价值的补充。