2011-05-25 45 views
0

因此,这里是我的MXML想获得工作:如何通过AsyncToken处理远程方法调用?

<?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"> 

    <fx:Script> 
     <![CDATA[ 
      import argoseye.main.Golem; 

      import mx.collections.ArrayCollection; 
      import mx.rpc.AsyncResponder; 
      import mx.rpc.AsyncToken; 
      import mx.rpc.Responder; 
      import mx.rpc.events.FaultEvent; 
      import mx.rpc.events.InvokeEvent; 
      import mx.rpc.events.ResultEvent; 
      import mx.rpc.remoting.RemoteObject; 
      protected function button1_clickHandler(event:MouseEvent):void 
      { 
       var ro:RemoteObject = new RemoteObject("destination"); 
       ro.endpoint = "http://Jesus/blazeds/messagebroker/amf"; 
       ro.addEventListener(InvokeEvent.INVOKE,onInvoke); 

       var token:AsyncToken = new AsyncToken(); 
       token.addResponder(new AsyncResponder(onResult,onFault)); 

       token = ro.getCells(); 
       textfeld.text = textfeld.text + "Clickhandler called .... \n"; 

      } 

      public function onResult(event:ResultEvent,token:Object):void { 
       textfeld.text = textfeld.text + "Resulthandler called .... \n"; 
       var cellList:ArrayCollection = event.result as ArrayCollection; 

      } 

      public function onFault(event:FaultEvent,token:Object):void 
      { 
       textfeld.text = textfeld.text + "Faulthandler called .... \n"; 
      } 

      public function onInvoke(event:InvokeEvent):void { 
       textfeld.text = textfeld.text + "Invokehandler called .... \n"; 
      } 
     ]]> 
    </fx:Script> 

    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:Button x="1093" y="575" label="Button" click="button1_clickHandler(event)"/> 
    <s:TextArea x="1022" y="183" id="textfeld"/> 
</s:Application> 

输出是

Invokehandler叫....

clickHandler事件称为....

Resulthandler不会被调用,虽然BlazeDS控制台注册了一个成功的Resultevent。我做错了什么?

编辑:我试着将程序导出到一个类,它应该管理这些东西。

package argoseye.main 

{ import flash.events.Event;

import mx.collections.ArrayCollection; 
import mx.messaging.ChannelSet; 
import mx.messaging.channels.AMFChannel; 
import mx.rpc.AsyncResponder; 
import mx.rpc.AsyncToken; 
import mx.rpc.events.FaultEvent; 
import mx.rpc.events.ResultEvent; 
import mx.rpc.remoting.RemoteObject; 

public class Schem 
{ 
    public var info:String=""; 


    public function Schem() 
    {  
    } 

    public function loadCurrentSchem():void 
    { 
     var ro:RemoteObject = new RemoteObject("Hibernatetest"); 
     ro.endpoint = "http://jesus/blazeds/messagebroker/amf"; 

     var token:AsyncToken = ro.getCells(); 
     token.addResponder(new AsyncResponder(onResult,onFault)); 

     info = info + "Loader Called ..."; 


    } 

    public function onResult(event:ResultEvent,token:Object):void { 
     var cellList:ArrayCollection = event.result as ArrayCollection; 
     info = info + "Resulthandler Called"; 

    } 

    public function onFault(event:FaultEvent,token:Object):void 
    { 

    } 
    //Eventhandlers 


    //Getters, Setters 


} 

}

如果我叫它,它不到达事件处理程序。我的错误在哪里?

回答

5

你的错误就在于这些行:

var token:AsyncToken = new AsyncToken(); 
token.addResponder(new AsyncResponder(onResult,onFault)); 
token = ro.getCells(); 

你在第1行创建一个新的令牌。 您在第2行指定了响应者。 然后你重新分配第3行的令牌。

你在第3行做的是有效地创建一个新的令牌,因此它没有附加响应者,因为它是一个新的实例。

所以它应该是:

var token:AsyncToken = ro.getCells(); 
//ro.getCells() will return a new instance of AsyncToken 
token.addResponder(new AsyncResponder(onResult,onFault)); 
+0

非常有启发!谢谢。我不清楚'token = ro.getCells();'的深层含义。 – Kai 2011-05-25 12:56:53

2

使用下面的代码:

<fx:Script> 
    <![CDATA[ 
     import argoseye.main.Golem; 

     import mx.collections.ArrayCollection; 
     import mx.rpc.AsyncResponder; 
     import mx.rpc.AsyncToken; 
     import mx.rpc.Responder; 
     import mx.rpc.events.FaultEvent; 
     import mx.rpc.events.InvokeEvent; 
     import mx.rpc.events.ResultEvent; 
     import mx.rpc.remoting.RemoteObject; 
     protected function button1_clickHandler(event:MouseEvent):void 
     { 
      var ro:RemoteObject = new RemoteObject("destination"); 
      ro.endpoint = "http://Jesus/blazeds/messagebroker/amf"; 
      ro.addEventListener(InvokeEvent.INVOKE,onInvoke); 

      var token:AsyncToken = ro.getCells(); 
      token.addResponder(new AsyncResponder(onResult,onFault)); 
      textfeld.text = textfeld.text + "Clickhandler called .... \n"; 

     } 

     public function onResult(event:ResultEvent,token:Object):void { 
      textfeld.text = textfeld.text + "Resulthandler called .... \n"; 
      var cellList:ArrayCollection = event.result as ArrayCollection; 

     } 

     public function onFault(event:FaultEvent,token:Object):void 
     { 
      textfeld.text = textfeld.text + "Faulthandler called .... \n"; 
     } 

     public function onInvoke(event:InvokeEvent):void { 
      textfeld.text = textfeld.text + "Invokehandler called .... \n"; 
     } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<s:Button x="1093" y="575" label="Button" click="button1_clickHandler(event)"/> 
<s:TextArea x="1022" y="183" id="textfeld"/> 

+0

它的工作。但是,如何调用构造函数有害? – Kai 2011-05-25 11:37:33

+0

我认为问题是由ro.getCells()函数返回的AsyncToken与您通过new创建的AsyncToken对象完全不同。因此,事件侦听器不会添加到令牌中,并且您无法获得正确的行为。 – phtrivier 2011-05-25 11:40:32

+0

@phtrivier绝对! :) – Constantiner 2011-05-25 13:49:35