2012-05-28 31 views
0

假設我在所有應用程序中都有一個單一模式內的NetConnection對象,它與所有數據訪問對象類共享。現在,你進入了一個屏幕,並要求加載5千條記錄,因爲你想搜索一些錯誤或任何其他信息。但是現在你只是意識到你在錯誤的屏幕上,而實際上你需要來自另一個「實體」的5千條記錄。如何防止您需要等待大約2分鐘,直到數據到達此處,以便您可以轉到另一個屏幕並請求一些不同的數據?我嘗試使用ESC按鈕作爲NetConnection.close()事件的關鍵調用者,但它實際上不起作用。它只是發送一個空的事件,並且該呼叫仍然返回。我知道我不能要求服務器不要繼續工作,但我想知道如何確保在按下ESC或類似的東西之後,ActionScript不會再打擾該特定的通話,並且您可以繼續你的生活。而且,當服務器響應那個電話時,在後臺,我將把它扔掉,因爲你已經同意取消它。如何取消與NetConnection的AMF呼叫?

Ps .:我沒有任何疑問如何聽ESC按鈕並通過它調用某種方法,我只想知道一旦用戶決定不想接收該數據時要調用什麼並且他/她想要繼續前進而不必關閉應用並再次打開。

編輯:

我試圖使通話結束後銷燬Responder對象,但沒有奏效。

 public function call(command:String, f:Function, fault:Function, ...parameters):void{ 
     var r:Responder = new Responder(f, fault); 
     this._Responder = r; 
     if(parameters.length == 0) 
      GATEWAY.call(command, _Responder); 
     else 
      GATEWAY.call(command, _Responder, parameters); 
    } 

    public function close():void{   
     _Responder = new Responder(function(obj:Object):void{}, function(obj:Object):void{}); 
     //_Responder = null; 
     trace("Canceled"); 
    } 

與這裏描述了代碼,我停止了對NetConnection::call電話,開始打電話,我寫了「呼叫功能」。所以這個函數會構建一個響應器,它將在類範圍內,所以即使在調用完成之後我仍然可以訪問它,並且ESC按鈕會調用「Close」函數。我試着將它設置爲空並重新構建它。它沒有工作。 我認爲在NetConnection發起呼叫之後,響應者不能被改變。

+0

是否有您必須使用單連接或一些你正在尋找從這個獲得利益的一個原因?無論我的想法是在您調用的單例中設置取消方法,在取消方法中,您都會創建一個新的NetConnection並停用您所使用的任何處理程序(說實話,我本人並沒有直接使用NetConnection,而是使用了AbstractService RPC類和IResponder實現對象來實現類似的任務,但通常我們實際上擁有每個Java服務的服務類實例,而不是每個服務類的每個方法)。 – shaunhusain

+0

我試着調用'NetConnection :: close',重建'NetConnection'類並將對象設置爲null。我也嘗試了我剛剛在編輯中描述的內容,即不僅將NetConnection對象設置爲null,還對Responder對象設置null。似乎沒有任何工作。 –

回答

0

NetConnection類不支持取消AMF調用。然而,正如Shaunhusain所說,你可以保存從你的單例類中調用的方法的存儲(數組,字典),並且一旦你取消了一個調用,它應該僅僅爲那個調用禁用結果事件監聽器。

因此,即使您退出等待AmfCall結果的模塊,您的單例類也不會有回調,您可以繼續到下一個屏幕。

public class Call 
{ 
var responder:Responder; 
var service:String; 
var params:Array; 

public function Call(service:String, params:Array) 
{ 
    responder = new Responder(this.onResult, this.onFault); 
    this.service = service; 
    this.params = params; 

} 

public function removeListeners():void 
{ 
    removeEventListener(CallEvent.RESULT, onResult); 
} 

public function onResult(result:Object):void 
{ 
    this.result = result; 
    dispatchEvent(new CallEvent(CallEvent.RESULT, callId, result)); 
} 

}

呼叫類是負責對接收的結果分派事件。但是,如果沒有事件偵聽器,則派發的事件將不會被任何類偵聽。

此代碼片段取自AmfPhpToolBox。您可能想使用該庫來解決所有這些問題。

AMFPHPToolBox

+0

我不認爲我可以使用NetConnection類來做到這一點。 –

+0

正如我所說的,你不能用NetConnection類來做到這一點,而是需要保留一個具有自己的結果事件或回調函數的調用類。每當你通過你的單例類進行調用時,將調用排入本地存儲並設置結果事件監聽器。呼叫處理完成後,調度結果事件。 –