我有一个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);
}
所有这些都很好,但使用它需要大量的工作。在request
上调用send()
时,我总是期望有一个Response
对象。
理想情况下,我希望能够调用request.send()
并让它直接返回Response
对象,而不必处理侦听器:
var result:Response = request.send();
这可能吗?如果是,我该怎么做?
异步事件启动和响应之间需要经过一段时间或完成代码。
由于代码除了侦听事件返回之外没有做任何其他事情,因此在等待期间挂起是没有意义的。
如果编写所有额外的代码对每个事件-响应对来说都太麻烦了,那么创建一个工厂类来处理事件的创建和删除,这将把它简化为一行,但你所做的只是隐藏事件处理程序,在异步通信时,这是无法避免的。
编辑
您可以创建一个类,将其绑定到一个抽象类中,并且源自该类的不同类将以不同的方式处理不同的命令和响应。
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); }
然而,这种设置的效用实际上取决于你想要实现的目标。对于异步调用,它将始终返回到事件处理。