如何使用网络连接取消 AMF 呼叫



假设我在单一实例模式中有一个 NetConnection 对象,该对象与我所有应用程序中的所有数据访问对象类共享。现在,您进入屏幕并要求加载5数千条记录,因为您想搜索一些错误或其他什么。但是现在您刚刚意识到您在错误的屏幕上,您实际上想要来自另一个"实体"的 5000 条记录。如何防止您不得不等待近 2 分钟直到数据到达此处,以便您可以转到另一个屏幕并请求一些不同的数据?我尝试使用 ESC 按钮作为 NetConnection.close() 事件的键调用方,但它实际上不起作用。它只是调度一个空事件,调用仍然返回。我知道我不能要求服务器不继续做他的工作,但我想知道如何确保在你按下 ESC 或类似的东西后,ActionScript 不会再打扰那个特定的调用,你可以继续你的生活。而且,当服务器在后台响应该呼叫时,我将将其丢弃,因为您已经同意取消它。

Ps.:我对如何收听ESC按钮并通过它调用某些方法没有任何疑问,我只想知道一旦用户决定他不想再接收该数据并且他/她想继续前进而无需关闭应用程序并再次打开。

编辑:

我试图在拨打电话后销毁响应程序对象,但它不起作用。

        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 按钮将调用"关闭"函数。我尝试将其设置为 null 并重新构建它。它没有用。我认为在网络连接发出呼叫后,无法更改响应器。

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));
}

}

Call 类负责在收到结果时调度事件。但是,如果没有事件侦听器,则任何类都不会侦听所调度的事件。

此代码片段取自 AmfPhpToolBox。您可能希望改用该库来解决所有这些问题。

AMFPHPToolBox

最新更新