2012-01-11 68 views
0

我有我用我的Zend_AMF端點通信的AS3類:可能傾聽事件然後返回類的結果?

package test 
{ 
    import flash.events.Event; 

    import mx.rpc.AbstractOperation; 
    import mx.rpc.events.ResultEvent; 
    import mx.rpc.remoting.RemoteObject; 

    [Bindable] 
    [RemoteClass(alias="Request")] 

    public class Request 
    { 
     public var url:String = ''; 

        //There are a lot more properties, but I have removed them for brevity 

     public function Request(url:String){ 
      this.url = url; 
     } 

     public function send():void{ 

      //Create the remoting object 
      var remotingObject:RemoteObject = new RemoteObject('test'); 
      remotingObject.endpoint = "http://site.com/endpoint.php"; 
      remotingObject.showBusyCursor = true; 

      //Send it 
      remotingObject.source = this.url; 
      var op:AbstractOperation = remotingObject.getOperation(null); 

      op.addEventListener(ResultEvent.RESULT, result); 
      op.send(this); 
     } 

     private function result(event:ResultEvent){ 
      this.dispatchEvent(event); 
     } 
    } 
} 

要使用它,我做了以下內容:

var request:Request = new Request('someRemotingCommand'); 
request.addEventListener(ResultEvent.RESULT, catchEvent); 
request.send(); 

public function catchEvent(event:ResultEvent):void{ 
    var result:Response = event.result as Response; //Get result as my response object 
    trace(result.responseText); 
} 

所有這一切工作正常,但它需要大量的的工作使用它。在我的request上致電send()時,我始終期望有一個Response對象。

理想情況下,我想能夠調用request.send()並將它而不是直接返回不必處理收聽者Response對象:

var result:Response = request.send(); 

這可能嗎?如果是這樣,我該如何去做這件事?

回答

0

有一段時間過去了,或者需要在異步事件啓動和響應之間完成的代碼。

作爲代碼沒有做任何事情,聽着事件回來,它是沒有意義的,當它在等待時掛起。

如果編寫所有額外的代碼對於每個事件響應對來說工作量太大,請創建一個工廠類來處理事件創建和刪除操作,將其簡化爲一行,但是您所做的只是隱藏事件處理程序,這在處理異步通信時是無法避免的。


編輯

您可以創建一個捆綁成一個抽象類,這個類,不同類別從這個類所產生將處理不同命令和響應不同。

var request:Request = new Request('someRemotingCommand'); 
request.addEventListener(ResultEvent.RESULT, catchEvent); 
request.send(); 

public function catchEvent(event:ResultEvent):void{ 
    var result:Response = event.result as Response; //Get result as my response object 
    trace(result.responseText); 
} 

這樣的設置的效用實際上取決於你想實現但什麼。使用異步調用時,它總是會回到事件處理。

+0

我喜歡工廠類的想法。你能用一個簡單的例子來更新你的答案嗎? – F21 2012-01-11 03:41:40

+0

經過進一步調查,我感覺工廠可能無法將代碼簡化爲1行,因爲無法從事件監聽器函數返回。它是否正確? – F21 2012-01-11 04:39:32

+0

好吧,你可以用一個你有類構造函數的方式創建它,並帶兩個變量('request'和'result'),然後這個類會更新結果,只要響應不是一個簡單的對象,比如字符串或數字(因爲你不能在as3中做指針) – Daniel 2012-01-11 16:25:16