Я попробую еще одну идею:
Пусть ваш объект доступа к данным возвращает их собственные AsyncToken (или некоторые другие объекты, которые инкапсулируют ожидающий вызов) вместо AsyncToken, который приходит из вызова RPC. Итак, в 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 .