2012-01-20 14 views
0

&を呼び出す際に、呼び出し元から返されたオブジェクトをURLに作成する必要があります。ここに私ができることが必要です。URLLoader.load呼び出しから返された文字列を処理する必要があります

  1. 私はWebサーバーと通信するクラスを持っています。
  2. 私はこのクラス(getPersonと呼ばれる)に、Webサーバーから返されたXMLデータから読み込まれたPersonオブジェクトを返す関数があります。

私が実行している問題(これは非常に一般的な問題ですが、私が見ることができる解決策は見当たりませんでした)は、URLLoaderのロードメソッドが非同期であることです。

XMLを解析してオブジェクトをイベントハンドラに取り込むEvent.COMPLETEイベントでイベントリスナーを起動しましたが、元々このオブジェクトを元のgetPerson関数?

サーバーからの戻りが戻ってくるまでに、私のメソッドは終了し、人口の多いPersonオブジェクトを返すことはできません。

私の質問はどのように私はこれを達成することができますか?私はまだActionScriptにかなり新しいですし、これで1日のために私の車輪を回転させています。

私は私が午前問題を示し、いくつかのサンプルコードを追加しました - 私は、私が使用しているものを単純化しています

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アプリケーションファイルに戻して、そこで使用できるようにすることです。

ありがとうございます!

+0

、オブジェクト変数をLAREとgetter/setter関数を作成します。副作用として、コードを元のコードからEvent.COMPLETEイベントに移動させるのはなぜですか? – Angelo

答えて

1

:あなたのDALに

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... 
} 

クラス、decあなたには、いくつかのコードを公開する場合に役立つだろう、すなわち

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

ありがとうございます!それは魅力のように機能します! – Nutkraker

0

メイン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); 
     } 


    } 
} 

希望MXMLアプリケーションファイルで、このヘルプ

+0

こんにちはJeetendra - オリジナルの質問に追加したサンプルコードを変更することで、あなたが意味することを私に見せることができますか?私はあなたが意味することを理解していますが、私はAS3でそれを行う方法がわかりません...ありがとう! – Nutkraker

関連する問題