【问题标题】:Possible to listen for event then return result from class?可以监听事件然后从类中返回结果吗?
【发布时间】:2012-01-11 03:26:39
【问题描述】:

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

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

【问题讨论】:

    标签: actionscript-3 events event-handling


    【解决方案1】:

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

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

    这种设置的实用性实际上取决于您想要实现的目标。使用异步调用,它总是会回到事件处理。

    【讨论】:

    • 我喜欢工厂类的想法。你能用一个简单的例子来更新你的答案吗?
    • 经过进一步调查,我感觉工厂可能无法将代码简化为 1 行,因为无法从事件侦听器函数返回。这是正确的吗?
    • 好吧,您可以通过让类构造函数获取两个变量(requestresult)的方式创建它,然后该类将更新结果,只要响应不是一个简单的对象,如字符串或数字(因为你不能在 as3 中做指针)
    • 问题是你仍然需要监听响应对象的变化,所以无论如何你都会得到另一个监听器。如果您不处理它,那么从服务器获取任何信息是没有意义的。我可以看到您是否有一堆响应进来,并且您希望一个控制器来处理这一切,而不是让调度程序/请求必须处理它,但这只是将侦听器分配给不同类的问题.
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多