Можно прослушать событие, а затем вернуть результат из класса? - PullRequest
0 голосов
/ 11 января 2012

У меня есть класс 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);
}

Все это прекрасно работаетно для его использования требуется много работы.Я всегда ожидаю объект Response при вызове send() на моем request.

В идеале я хотел бы иметь возможность вызвать request.send() и заставить его возвращать объект Response напрямую и безиметь дело со слушателем:

var result:Response = request.send();

Возможно ли это?Если так, как я могу сделать это?

1 Ответ

0 голосов
/ 11 января 2012

есть время или код, который должен завершиться между запуском и ответом асинхронного события.

Код as не делает ничего другого, кроме прослушивания возвращения события, он не будетимеет смысл зависать, пока он ждет.

Если написание всего дополнительного кода является слишком большой работой для каждой пары событие-ответ, создайте фабричный класс, который будет обрабатывать создание и удаление событий, что упростит его до одной строки., но все, что вы делаете, это скрываете обработчики событий, чего вы не можете избежать, когда дело доходит до асинхронного взаимодействия.


edit

Вы можете создать класс, который объединяетэто в один абстрактный класс, и разные классы, происходящие из этого класса, будут по-разному обрабатывать разные команды и ответы.

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

полезность такой настройки действительно зависит от того, что вы пытаетесьчтобы достичь хотя.При асинхронных вызовах он всегда возвращается к обработке событий.

...