Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 是否可以侦听事件,然后从类返回结果?_Actionscript 3_Events_Event Handling - Fatal编程技术网

Actionscript 3 是否可以侦听事件,然后从类返回结果?

Actionscript 3 是否可以侦听事件,然后从类返回结果?,actionscript-3,events,event-handling,Actionscript 3,Events,Event Handling,我有一个as3类,用于与Zend_AMF端点通信: package test { import flash.events.Event; import mx.rpc.AbstractOperation; import mx.rpc.events.ResultEvent; import mx.rpc.remoting.RemoteObject; [Bindable] [RemoteClass(alias="Request")] publi

我有一个as3类,用于与Zend_AMF端点通信:

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);
}
所有这些都很好,但使用起来需要很多工作。在我的
请求
上调用
send()
时,我总是希望得到
响应
对象

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

var result:Response = request.send();

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

在异步事件启动和响应之间需要经过一段时间或代码才能完成

因为代码没有做任何其他的事情来监听事件返回,所以在等待时挂起是没有意义的

如果编写所有额外的代码对于每个事件响应对来说都是太多的工作,那么创建一个工厂类来处理事件的创建和删除,这将把它简化为一行,但您所做的只是隐藏事件处理程序,这在异步通信中是无法避免的


编辑

您可以创建一个类,将其捆绑到一个抽象类中,并且从该类派生的不同类将以不同的方式处理不同的命令和响应


不过,这种设置的效用实际上取决于您试图实现的目标。对于异步调用,它总是返回到事件处理。

我喜欢工厂类的想法。你能用一个简单的例子来更新你的答案吗?经过进一步的调查,我觉得工厂可能无法将代码简化为一行,因为无法从事件侦听器函数返回。这是正确的吗?您可以通过让类构造函数获取两个变量(
request
result
)的方式创建它,然后类将更新结果,只要响应不是字符串或数字之类的简单对象(因为在as3中不能执行指针)问题是,您仍然需要侦听响应对象中的更改,因此您最终会遇到另一个侦听器。如果您不处理任何信息,那么从服务器获取任何信息都毫无意义。我可以看到是否有一堆响应,您希望一个控制器来处理所有响应,而不是让调度程序/请求来处理响应,但这只是将侦听器分配给不同的类的问题。
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);
}