2012-05-28 33 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类来做到这一点,而是需要保留一个具有自己的结果事件或回调函数的调用类。每当你通过你的单例类进行调用时,将调用排入本地存储并设置结果事件监听器。呼叫处理完成后,调度结果事件。 –