我一直在尝试将文本文件加载到字符串变量中。名为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
答案 0 :(得分:2)
您正面临同步与异步问题
调度onLoaded
时textLoader
异步调用函数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 :)
}