在AS3中,将文本文件加载到字符串中

时间:2014-12-31 14:53:50

标签: actionscript-3 asynchronous

我一直在尝试将文本文件加载到字符串变量中。名为text.txt的文本文件包含successful。这是代码:

public class Main extends Sprite
{
    private var text:String = "text";
    private var textLoader:URLLoader = new URLLoader();

    public function Main() {
        textLoader.addEventListener(Event.COMPLETE, onLoaded);
        function onLoaded(e:Event):void {
            trace("Before 1: " + text); //output: text
            trace("Before 2: " + e.target.data); //output: successful
            text = e.target.data;
            trace("After 1: " + text); //output: successful - yay!!! it worked

        }

        textLoader.load(new URLRequest("text.txt"));

        trace("After 2: " + text); //output: text - what??? nothing happened??? but it just worked

    }

}

输出:

After 2: text Before 1: text Before 2: successful After 1: successful

1 个答案:

答案 0 :(得分:2)

您正面临同步与异步问题

调度onLoadedtextLoader异步调用函数Event.COMPLETE,而不是"After 2"之后直接调用的textLoader.load

您必须牢记的是textLoader.load是非阻塞的,这意味着"After 2"可能(您可以始终假设)在onLoaded之前执行。

如果在答案的这一点上你仍然感到困惑,我会说加载一个文件需要花费时间并且执行一条指令可能会有所不同,但是大多数时间比加载文件要短(想象一下这个文件)是4go大)。你无法预测会发生什么,也许磁盘已经非常繁忙,你可能需要等待!但是你可以利用这段宝贵的时间来完成与文本文件完全无关的其他事情,这就是为什么它有时会被编程语言异步制作(php例如同步加载文件)。

下一步


既然我已经解释过"After 2"并不存在,那么你必须使用"After 1" 作为一个入口点,但没有任何东西可以帮助你制作一个名为afterLoad的函数,你可以这样称呼它

public function Main() {
        textLoader.addEventListener(Event.COMPLETE, onLoaded);

        function onLoaded(e:Event):void {
            trace("Before 1: " + text); //output: text
            trace("Before 2: " + e.target.data); //output: successful
            text = e.target.data;
            afterLoad();
        }

        textLoader.load(new URLRequest("text.txt"));
    }


}

private function afterLoad():void {
    trace("After: " + text); // it should work now :)
}