我再尝试一个想法:
让您的数据访问对象返回它们自己的 AsyncToken(或封装挂起调用的其他一些对象),而不是来自 RPC 调用的 AsyncToken。因此,在 DAO 中,它看起来像这样(这是非常粗略的代码):
public function deleteThing( id : String ) : DeferredResponse {
var deferredResponse : DeferredResponse = new DeferredResponse();
var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);
var result : Function = function( o : Object ) : void {
deferredResponse.notifyResultListeners(o);
}
var fault : Function = function( o : Object ) : void {
deferredResponse.notifyFaultListeners(o);
}
asyncToken.addResponder(new ClosureResponder(result, fault));
return localAsyncToken;
}
和DeferredResponse
类ClosureResponder
当然不存在。而不是发明你自己的,你可以使用AsyncToken
而不是DeferredResponse
,但公共版本AsyncToken
似乎没有任何方式来触发响应者,所以你可能无论如何都必须继承它。ClosureResponder
只是一个IResponder
可以在成功或失败时调用函数的实现。
无论如何,上面的代码做它的业务的方式是它调用一个 RPC 服务,创建一个封装挂起调用的对象,返回该对象,然后当 RPC 返回时,一个闭包result
或被fault
调用,因为它们仍然有引用进行 RPC 调用时的范围,它们可以触发挂起的调用/延迟响应上的方法。
在命令中,它看起来像这样:
public function execute( ) : void {
var deferredResponse : DeferredResponse = dao.deleteThing("3");
deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
deferredResponse.addEventListener(FaultEvent.FAULT, onFault);
}
或者,您可以重复该模式,让该execute
方法返回其自己的延迟响应,当触发命令从 DAO 获得的延迟响应时,该响应将被触发。
但。我觉得这不是特别漂亮。通过使用现有的许多应用程序框架之一来或多或少准确地解决此类问题,您可能会做一些更好、不那么复杂和不那么纠结的事情。我的建议是Mate。