ActionScript-3计时问题/不需要的后台多线程

ActionScript-3计时问题/不需要的后台多线程,actionscript-3,Actionscript 3,我创建了一个具有私有变量和公共get属性的新类。 当我创建一个新的类实例时,它会将文本文件内容加载到private vars——加载它可能需要一些时间 创建新实例后,我尝试使用get属性获取private var的值: var item1:MyItem = new MyItem("0001"); trace(item1.ItemName); 嗯,输出为空。 ItemName指向的字符串不是未定义的,它包含数据。 因此,这就像一个计时问题,ActionScript可能正在使用后台多线程运行代码

我创建了一个具有私有变量和公共get属性的新类。
当我创建一个新的类实例时,它会将文本文件内容加载到private vars——加载它可能需要一些时间

创建新实例后,我尝试使用get属性获取private var的值:

var item1:MyItem = new MyItem("0001");

trace(item1.ItemName);
嗯,输出为空。
ItemName指向的字符串不是未定义的,它包含数据。
因此,这就像一个计时问题,ActionScript可能正在使用后台多线程运行代码,因此它在运行完MyItem c'tor中的所有方法(将文本文件数据加载到ItemName指向的字符串变量中的方法)之前调用trace命令

有没有办法强制ActionScript避免使用这种不需要的“后台多线程”,并正常运行代码(按照命令的顺序)?
我的意思是“在运行完第一个命令之前不要运行第二个命令”

谢谢你的帮助。

Freddy

理想情况下,您希望执行以下操作:

  • 为用于加载XML的任何组件/类的
    Loaded
    事件,向
    MyItem
    类添加事件处理程序

  • MyItem
    类中添加一个事件,该事件将冒泡步骤1中加载的
    事件,以便
    MyItem
    类的客户端可以向其附加处理程序。在步骤1中创建的
    加载的
    处理程序中触发此事件

  • 将事件处理程序附加到在步骤2中创建的事件,并将
    跟踪
    代码放在该处理程序中


  • 理想情况下,您希望执行以下操作:

  • 为用于加载XML的任何组件/类的
    Loaded
    事件,向
    MyItem
    类添加事件处理程序

  • MyItem
    类中添加一个事件,该事件将冒泡步骤1中加载的
    事件,以便
    MyItem
    类的客户端可以向其附加处理程序。在步骤1中创建的
    加载的
    处理程序中触发此事件

  • 将事件处理程序附加到在步骤2中创建的事件,并将
    跟踪
    代码放在该处理程序中


  • 这不是多线程,从外部加载文本文件只是一个完全异步的操作。在MyItem类中,需要为该加载程序提供一个Event.COMPLETE处理程序。从这里开始,我要做的是:

    选项1:在MyItem的文件加载完整处理程序中,设置一个标志。使用getter的类必须通过另一个getter检查标志,以查看数据是否存在,并使用它(如果存在)或设置侦听器等待它(如果不存在)。一旦加载了数据,您就可以立即对其进行同步访问(缓存)

    选项2:在MyItem中保留“isLoaded”标志的替代方法是让MyItem的Loader COMPLETE处理程序分派它自己的文本加载事件。然后,负责创建MyItem实例的实例将监听该消息,并知道在文本文件出现之前不要请求该文本文件的内容


    任何一种方法都会奏效。这取决于你去找出哪一个是有意义的。如果您不希望立即访问加载的数据(即,您正在启动时加载文本以供稍后使用),我的第一个选项可能会避免不必要的侦听器。如果您确实希望在加载文本文件时立即使用它的数据,那么第二种方法是有意义的。

    这不是多线程,从外部加载文本文件只是一个完全异步的操作。在MyItem类中,需要为该加载程序提供一个Event.COMPLETE处理程序。从这里开始,我要做的是:

    选项1:在MyItem的文件加载完整处理程序中,设置一个标志。使用getter的类必须通过另一个getter检查标志,以查看数据是否存在,并使用它(如果存在)或设置侦听器等待它(如果不存在)。一旦加载了数据,您就可以立即对其进行同步访问(缓存)

    选项2:在MyItem中保留“isLoaded”标志的替代方法是让MyItem的Loader COMPLETE处理程序分派它自己的文本加载事件。然后,负责创建MyItem实例的实例将监听该消息,并知道在文本文件出现之前不要请求该文本文件的内容


    任何一种方法都会奏效。这取决于你去找出哪一个是有意义的。如果您不希望立即访问加载的数据(即,您正在启动时加载文本以供稍后使用),我的第一个选项可能会避免不必要的侦听器。如果您确实希望在加载文本文件的瞬间使用它的数据,那么第二种方法是有意义的。

    您的代码实际上是在单个线程中运行的,但是Actionscript中典型的数据加载类是异步的。很可能在调用trace之前没有加载数据。要在加载数据时收到通知,应在加载对象上使用事件侦听器

    var loader:URLLoader = new URLLoader();
    loader.addEventListener( Event.COMPLETE, onLoadComplete );
    loader.load( new URLRequest( 'path_to_data.xml' ) );
    
    function onLoadComplete( event:Event ):void 
    {
         trace( loader.data );
    }
    

    我们有一个更完整的示例。

    您的代码实际上是在单个线程中运行的,但是Actionscript中典型的数据加载类是异步的。很可能在调用trace之前没有加载数据。要在加载数据时收到通知,应在加载对象上使用事件侦听器

    var loader:URLLoader = new URLLoader();
    loader.addEventListener( Event.COMPLETE, onLoadComplete );
    loader.load( new URLRequest( 'path_to_data.xml' ) );
    
    function onLoadComplete( event:Event ):void 
    {
         trace( loader.data );
    }
    

    有一个更完整的示例。

    Flash在单个线程上运行。查看用于加载数据的代码将非常有用。Flash在单个线程上运行。查看用于加载数据的代码将非常有用。