可以监听事件然后从类返回结果吗?

时间:2012-01-11 03:26:40

标签: actionscript-3 events event-handling

我有一个用于与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);
}

所有这一切都运行良好,但使用它需要大量的工作。在Response上调用send()时,我总是希望有一个request对象。

理想情况下,我希望能够调用request.send()并让它直接返回Response对象,而不必处理听众:

var result:Response = request.send();

这可能吗?如果是这样,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

有一段时间过去或需要在异步事件启动和响应之间完成的代码。

as代码没有做任何其他事情来监听事件回来,在等待时挂起是没有意义的。

如果为每个事件响应对编写所有额外代码太多工作,请创建一个工厂类来处理事件创建和删除,将其简化为一行,但您所做的只是隐藏事件处理程序,在异步通信方面,你无法避免这种情况。


修改

你可以创建一个将它捆绑成一个抽象类的类,而来自这个类的不同类将以不同的方式处理不同的命令和响应。

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

这种设置的实用性实际上取决于你想要实现的目标。通过异步调用,它将始终返回到事件处理。