ActionScript3:在一个类中通过 addEventListener 读取文件,如何将数据传递给不同的类

Posted

技术标签:

【中文标题】ActionScript3:在一个类中通过 addEventListener 读取文件,如何将数据传递给不同的类【英文标题】:ActionScript3: in one class read file by addEventListener, how to pass data to a different class 【发布时间】:2020-10-10 16:26:55 【问题描述】:

有很多与我类似的问题,但没有一个能解决我的问题。

我有这门课-

package com.test

    import flash.events.*;
    import flash.net.*;
    
    import com.test.LogUtils;
    import mx.logging.ILogger;
    
    public class LoadExtUrl extends EventDispatcher
    
        private var baseUrl:String;
        private var log:ILogger = LogUtils.getLogger(LoadExtUrl);
        
        public function LoadExtUrl()
        
            log.debug ("100 In LoadExtUrl()");
            super(null);
        
        
        public function loadBaseUrl():String
        
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.VARIABLES;
            loader.addEventListener(Event.COMPLETE, urlLoader_completeHandler);
            
            function urlLoader_completeHandler(event:Event):void
            
                var loader:URLLoader = URLLoader(event.target);
                this.baseUrl = loader.data.baseurl;
                dispatchEvent(new Event("GOTRESULTS"));
                log.debug ("200 In LoadExtUrl, baseUrl="+this.baseUrl);
            
            
            loader.load(new URLRequest("sri-config-files/url.properties"));
            
            log.debug ("300 In LoadExtUrl, baseUrl="+this.baseUrl);
            return this.baseUrl;
        
    

现在我想在许多其他类中读取 baseUrl 的值。

在另一个类中,我有以下代码 -

public class UrlHelper

    public static var myLoadExtUrl:LoadExtUrl = new LoadExtUrl();
    public static var baseUrl:String;
    
    public function UrlHelper()
    
    
    public static function getBaseUrl():void
    
        myLoadExtUrl.addEventListener("GOTRESULTS", xmlLoadCompleted);
        log.debug("400 In UrlHelper, baseUrl ="+baseUrl);
    
    
    private static function xmlLoadCompleted(e:Event):void 
    
        baseUrl=myLoadExtUrl.loadBaseUrl();
        log.debug("500 In UrlHelper, baseUrl ="+baseUrl);
    

记录顺序 -

100 In LoadExtUrl()
300 In LoadExtUrl, baseUrl=null
200 In LoadExtUrl, baseUrl=http://abcxyz.com:8080/

400 In UrlHelper, baseUrl =null --> here only I need the value

我该如何解决这个问题?

【问题讨论】:

因为 sendUrl(...) 方法不返回任何内容。因此,您没有得到任何 baseUrl = myLoadExtUrl.sendUrl(); 嗨@Organis:谢谢。我更正了代码。实际上我尝试了很多选项并在这里粘贴了错误的代码。 sendUrl() 没有返回任何东西,它是无效的。但是在调用 addEventListener() 之后,在 sendUrl() 中,该值为 null。因为 addEventListener() 不是阻塞调用。所以我试图在 sendUrl() 中获取值并返回它,即使那样它也不起作用 - public function sendUrl():String ....... loader.addEventListener(Event.COMPLETE, handleComplete); loader.load(request); trace(baseUrl); -> NULL return baseUrl; 根据定义加载是异步的,因此只有在接收到加载器调度的Event.COMPLETE 时才会收到有效的baseUrl。所以,你做myLoadExtUrl.addEventListener(Event.COMPLETE,getThatUrl); function getThatUrl(e:Event=null) this.baseUrl=myLoadExtUrl.baseUrl; 嗨@Vesper:是的,我已经做到了。请检查 UrlHelper.xmlLoadCompleted() 函数。我把它标记为强。在这里我放了 baseUrl=myLoadExtUrl.baseUrl;我在这个函数中得到了值,但在 UrlHelper.getBaseUrl() 中没有。如何解决? @NirmalyaSinha 好的,现在您甚至都没有尝试将任何内容放入 UrlHelper.baseUrl 中,所以它显然是空的。此外,正如 Vesper 指出的那样,如果您从加载的数据中获取该数据,那么显然在您开始加载过程时它是不可用的。 【参考方案1】:

我想我需要写一些解释。

什么是异步操作?这是一个操作

需要一些(最初未知或无法确定)时间才能完成 不阻塞代码执行,简单来说,当你开始加载代码时,不会停止等待操作完成,它会立即开始执行剩下的代码,而不考虑那个操作状态李>

因此,您正在构建的事物中的实际事件流是:

    UH 类告诉 LEU 类开始加载 ...一段时间过去了... LEU 类检测到加载过程结束。 加载的数据可用。 LEU 调度自定义事件。 UH 检测到事件并最终CAN获取数据。

所以,LoadExtUrl 类:

package

    import flash.events.Event;
    import flash.events.EventDispatcher;
    
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLLoaderDataFormat;
    
    public class LoadExtUrl extends EventDispatcher
    
        private var baseUrl:String;
        private var loader:URLLoader;
        
        // Interface method.
        public function loadBaseUrl():String
        
            var aRequest:URLRequest;
            
            // Form the HTTP request.
            aRequest = new URLRequest;
            aRequest.url = "sri-config-files/url.properties";
            
            // Initiate the loading process.
            loader = new URLLoader;
            loader.dataFormat = URLLoaderDataFormat.VARIABLES;
            loader.addEventListener(Event.COMPLETE, onLoad);
            loader.load(aRequest);
            
            // Data are NOT available yet at this point.
        
        
        // Data loading COMPLETE handler.
        private function onLoad(e:Event):void
        
            // Data are AVAILABLE at this point.
            
            // Extract the data.
            baseUrl = loader.data.baseurl;
            
            // Clean up.
            loader.removeEventListener(Event.COMPLETE, onLoad);
            loader = null;
            
            // Tell anyone willing to listen about the data availability.
            var anEvent:Event;
            
            // Feel free to use predefined constants instead of custom
            // event names. It will protect you against typo errors.
            anEvent = new Event(Event.COMPLETE);
            dispatchEvent(anEvent);
        
    

使用方法:

public class UrlHelper

    static public var baseUrl:String;
    
    static private var loadExt:LoadExtUrl;
    
    // Interface method.
    static public function getBaseUrl():void
    
        // Data are NOT available yet at this point.

        loadExt = new LoadExtUrl;

        // Data are NOT available yet at this point.
        
        // Subscribe to the very same event name
        // that class is going to dispatch.
        loadExt.addEventListener(Event.COMPLETE, onAnswer);

        // Data are NOT available yet at this point EITHER.
        // Loading is an asynchronous operation. We started
        // the loading but we have to wait until the data are available.
    
    
    // This handler will be invoked when data are available.
    static private function onAnswer(e:Event):void 
    
        // Data are AVAILABLE at this point.
        
        // Extract the data.
        baseUrl = loadExt.baseUrl;
        
        // Clean up.
        loadExt.removeEventListener(Event.COMPLETE, onAnswer);
        loadExt = null;
        
        // You are free to use the obtained data at this point.
        // ...
    

【讨论】:

感谢@Organis,这消除了我的疑问。在我的代码中,我也得到了相同的行为,并想知道这是否正确。看起来代码的其余部分将保留在 onAnswer() 函数中。谢谢你的回答。 @NirmalyaSinha 没错,其余代码应该放在 onAnswer() 中,因为它是您需要的数据可用的地方。

以上是关于ActionScript3:在一个类中通过 addEventListener 读取文件,如何将数据传递给不同的类的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中通过构造函数复制类

如何在 WordPress 中通过模板为 HTML 标签动态添加类

在 Celery 中通过 id 检索任务结果

在c ++中通过引用返回类的向量[重复]

如何在 C++ 中通过引用返回类对象?

在 C++ 中通过引用传递类成员函数返回值