Необходимо обработать возвращаемую строку из вызова URLLoader.load - PullRequest
0 голосов
/ 20 января 2012

У меня есть требование в приложении Flex для создания и заполнения объекта по результатам возврата из URL-адреса.Вот что мне нужно сделать:

  1. У меня есть класс, который взаимодействует с веб-сервером.
  2. У меня есть функция в этом классе (называемая getPerson), которая бывернуть объект Person, который заполняется из данных XML, возвращаемых веб-сервером.

Проблема, с которой я сталкиваюсь (и, похоже, это очень распространенная проблема, но я не нашел решениячто я вижу, что это сработает) в том, что метод загрузки URLLoader является асинхронным.

У меня есть прослушиватель событий, запускающий событие Event.COMPLETE, которое анализирует XML и заполняет мой объект в обработчике событий, нокак мне вернуть этот объект в исходный код моего приложения, которое первоначально вызывало мою функцию getPerson?

Таким образом, к моменту возвращения с сервера мой метод завершается, и я не могу вернуть заполненное лицообъект.

Мой вопрос: как мне это сделать?Я все еще довольно новичок в ActionScript и уже целый день вращаю свои колёса по этому вопросу.

Я добавил пример кода, который демонстрирует мою проблему - я упростил то, что использую:

Файл приложения MXML:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                             xmlns:s="library://ns.adobe.com/flex/spark" 
                             xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
                             creationComplete="application1_creationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                var d:DAL = new DAL();
                d.CreateNewPerson( "John Smith" );
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

</s:Application>

Файл DAL.cs:

package
{
  import flash.events.Event;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import flash.net.URLRequestMethod;

  import mx.controls.Alert;

  public class DAL
  {
      public function DAL()
      {
      }

      public function CreateNewPerson( Name:String ):void
      {

          var strXML:String = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
          var loader:URLLoader = new URLLoader();
          loader.addEventListener(Event.COMPLETE, onPostComplete);
          var request:URLRequest = new URLRequest( "http://www.cnn.com" );
          request.method = URLRequestMethod.POST;
          request.data = strXML;
          loader.load(request);
      }

      private function onPostComplete( evt:Event ):void
      {
          //Process returned string

          //Here is where I need to return my object
                  var obj:Object = new Object()
      }
  }
}

Что мне нужно сделать, так это каким-то образом вернуть переменную "obj" в файл приложения MXML, чтобы я мог использовать ее там.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 20 января 2012

В вашем файле приложения mxml:

var d:DAL = new DAL();

protected function application1_creationCompleteHandler(event:FlexEvent):void
{
  d.CreateNewPerson( "John Smith" );
  d.addEventListener('PersonCreated', personCreated);
}

private function personCreated(evt:Event) :void
{
  var obj:Object = new Object();
  obj = d.ojectToBeReturned;
  // obj will contain the object from your class...
}

В вашем классе DAL объявите переменную объекта и создайте функцию получения / установки, т.е.

private var _myObjectToBeReturned:Object;

public function get ojectToBeReturned() :Object
{
  return _myObjectToBeReturned;
}

А по твоему методу

private function onPostComplete( evt:Event ):void
{
  //Here is where I need to return my object
  _myObjectToBeReturned = new Object();
  // Perform the process for the object.

  // Call the event from your parent.  
  this.dispatchEvent(new Event('PersonCreated'));
}
0 голосов
/ 20 января 2012

ваш основной файл MXML

<fx:Script>
    <![CDATA[
        import flash.events.Event;
        import mx.events.FlexEvent;

        protected function application1_creationCompleteHandler(event:FlexEvent):void
        {
            var d:DAL = new DAL();
            d.addEventListener(Event.COMPLETE, onLoadComplete);
            d.CreateNewPerson( "John Smith" );
        }

        private function onLoadComplete(e:Event):void 
        {
            trace("DATA LOADED")
        }
    ]]>
</fx:Script>

и ваш DAL.as

    package  
    {
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import mx.controls.Alert;
    /**
     * ...
     * @author Jeet Chauhan
     */
    public class DAL implements IEventDispatcher 
    {
        private var dispatcher:IEventDispatcher;

        public function DAL() {
            dispatcher = new EventDispatcher();
        }

        public function CreateNewPerson( Name:String ):void {
            /*var strXML:String = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
            var loader:URLLoader = new URLLoader();
            loader.addEventListener(Event.COMPLETE, onPostComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onPostComplete);
            loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onPostComplete);
            var request:URLRequest = new URLRequest( "http://www.cnn.com" );
            request.method = URLRequestMethod.POST;
            request.data = strXML;
            loader.load(request);*/

            // let assume data loaded and onPostComplete called 
            onPostComplete(new Event(Event.COMPLETE));
        }



        private function onPostComplete(evt:Event):void {
            //Process returned string

            //Here is where I need to return my object
            var obj:Object = new Object()

            dispatchEvent(evt);
        }


        /* INTERFACE flash.events.IEventDispatcher */

        public function dispatchEvent(event:Event):Boolean 
        {
            return dispatcher.dispatchEvent(event);
        }

        public function hasEventListener(type:String):Boolean 
        {
            return dispatcher.hasEventListener(type);
        }

        public function willTrigger(type:String):Boolean 
        {
            return dispatcher.willTrigger(type);
        }

        public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void 
        {
            dispatcher.removeEventListener(type, listener, useCapture);
        }

        public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
        {
            dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }


    }
}

надеюсь, эта помощь

...