2012-02-28 25 views
-2

私はURLLoader COMPLETEイベントである関数から値を取得しようとしていますが、関数外の変数を宣言しても値を取得できません。私は立ち往生している。AS3グローバル変数をどのように宣言しますか?

Flashの非同期性により、値を取得することが不可能になっているようです。これは動作します:

// Initialise a URLLoader to get XML data from XML file 
var myFPBLoader:URLLoader = new URLLoader(); 
myFPBLoader.load(new URLRequest("flightPlannerBoard.xml")); 


// Check XML data fully loaded 
myFPBLoader.addEventListener(Event.COMPLETE, processFPBxml); 

var myXML:XML = new XML();// Declared **outside** function 

function processFPBxml(e:Event):void { 
this.myXML = XML(e.target.data); 
trace("yep" + myXML); // This works 
myTraceXML(); 
} 

function myTraceXML(){ 
trace("more tests:" + myXML); // **This trace works** 
} 

trace("more tests:" + myXML); // This **doesn't** work 

いつでもどこでも使用できる値を取得しますか?

+2

これは以前の質問ではうまくいかない理由について説明しましたが、同じトピックについて新しい質問を作成しないでください。 – shanethehat

+0

[AS3 Putting function blah(){コードの周りにエラーが発生するコードは、私は持っていません](http://stackoverflow.com/questions/9464866/as3-putting-function-blah-around-code-generates -errors-on-lines-of-code-i-don) – shanethehat

+1

この質問を削除し、最後の回答を読んでください。 –

答えて

2

はここにあなたのコード内で何が起こっているかです:

  1. 機能processFPBxml()myTraceXML()と変数myFBPLoadermyXML宣言されています。
  2. XMLの読み込み開始myFPBLoader.loadこの時点でコードは停止しません。ロードは非同期呼び出しで、残りのコードはすぐに実行されます
  3. 空のXMLが取得されますtrace("more tests:" + myXML); // This **doesn't** work
  4. XMLがロードされ、Event.COMPLETEが送出されます。
  5. 前述のイベントに割り当てられたEventHandlerは、応答:processFPBxml()を呼び出します。この時点で、myXMLはダウンロードされたデータに割り当てられます。
  6. myTraceXML()が呼び出されます。

XMLをロードした後にコードを実行し続ける場合は、XMLからデータを取得した後に特定のタスクを実行し、それらの関数を呼び出す別々の関数にコードを分割する必要があります。この場合、myTraceXML()からinit()などの名前を変更したり、プログラムの残りの部分を書き込んだりすることができます(この特定の機能では不要です)。

+0

ありがとうございます。だから、私は循環の問題があるようです。私が最近尋ねた1つの質問では、関数にコードを入れないように言われました。なぜなら、それは私にエラーを与えるからです。これは真実です。関数の外でコードの残りの部分を実行すると、正常に動作します。しかし、myXML値を使用しようとすると、上記の理由でそれを行うことはできません。だから、私は上記のことから、自分のコードのための関数を持っていなければならず、なぜその関数の中からエラーをスローするのかを調べる必要があるのでしょうか? – user1203605

+0

理解しておくべき最も重要なことは、コードのフロー(実行)です。関数を宣言する順序は、必ずしも順次実行されるわけではありません。 1行目から、各行が何をしているのか、そしてその時点で何が期待できるのかを理解する必要があります。それが難しいと思われる場合は、コードを単純化し、機能に分解してください。それでも問題が解決しない場合は、すべてをデバッグしてエラーに注意してください。 – package

+0

ありがとうございます。関数でラップしたかったコードにエラーが表示されました。関数内でしか現れなかったので、その過程で多くのことを学んだので、あなたのフィードバックに感謝します。再度、感謝します。 – user1203605

0

前述のとおり、URLLoaderまでの要求されたデータは非同期的に取得されます。

これは、以降のデータには、のデータにFlashが受け取るまでアクセスできないことを示しています。あなたがしようとしていることは非論理的であり、実行できません。

表示する情報を探す際に、Webアプリケーションにローディングシンボルなどが表示されるのはなぜですか?

+0

私は非同期部分を理解しています。だから私は2つの機能を持っている。私が2番目の関数内で実行する必要があるコードの残りを置くことができれば、それは問題ありません。問題は、関数blah(){...でコードをラップするとすぐに}それはエラーを投げる。誰かが別の質問でそれを関数から守ると言ったので...今は2つの答えが残っています。a)関数を使わないでください。b)関数を使用してください。だから、私は関数を使用して、コードが関数に座るのが好きではない理由を知る必要があるようです...それは意味がありますか? – user1203605

関連する問題