ActionScript3: в файле чтения одного класса с помощью addEventListener, как передать данные в другой класс - PullRequest
0 голосов
/ 20 июня 2020

Есть много вопросов, похожих на мой, но ни один из них не решает конкретно мою проблему.

У меня есть этот класс -

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

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 22 июня 2020

Думаю, мне нужно записать некоторые пояснения.

Что такое асинхронная операция? Это операция, на выполнение которой

  • требуется некоторое (изначально неизвестное или неопределенное) время.
  • не блокирует выполнение кода, проще говоря, когда вы начинаете загрузку кода, это не так. Не переставая ждать завершения операции, он немедленно начинает выполнение остальной части кода безотносительно к этому статусу операции

Таким образом, фактический поток событий в том, что вы создаете, таков:

  1. Класс UH сообщает классу LEU о начале загрузки
  2. ... проходит некоторое время ...
  3. Класс LEU обнаруживает конец процесса загрузки.
  4. Доступны загруженные данные.
  5. LEU отправляет настраиваемое событие.
  6. 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.
        // ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...