-1

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

現在、関数呼び出しが実行され、イベントリスナーが追加されてから、メインコードに戻り、変数Dataをトレースしようとします。その結果、nullになり、後でイベントが完了すると、関数が実行されます。私が欲しいのは、イベントが完了し、showResult()が実行された後にのみプログラムコントロールが戻ることです。助けてください

4

3 に答える 3

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
}
于 2013-02-06T10:21:44.090 に答える
1

Flash で同期ダウンロードを行うことはできません。処理能力を使用せずにイベントを待機するには、Enter Frame リスナーとフラグを使用します。例:

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
    }
}
于 2013-02-06T10:15:07.350 に答える
0

As3.0 では、while() ループを使用する唯一の待機関数です。

以下の投稿を参照してください。

アクション スクリプト スリープ機能

AS3-スリープ機能

残念ながら、スリープ機能に相当する 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"));
    }
}
于 2013-02-06T09:15:59.963 に答える