2

フレックスで HTTP サービスを使用する方法については明確ですが、サービスを呼び出す機能とサービスの応答を別の ActionScript クラスで取得する機能を分離したいと考えています。HTTP サービスの応答を flex で返す方法を知っている人はいますか?

例えば

IN UTILITY クラスには、1 つの URL を指定する 1 つのメソッドが必要で、その場所から取得したデータが返されます。それでおしまい。次のコード スニペットを検討してください。から取得した参照コードは、flex でプログラムで http サービスを作成できませんでした

        private function callService():void
        {
            var requestObj:Object = {};
            requestObj.q = cityName.text.toString();
            requestObj.format = FORMAT;
            requestObj.num_of_days = cNUMBER_OF_DAYS;
            requestObj.key = API_KEY;

            var weatherService:HTTPService = new HTTPService();
            weatherService.url = BASE_URL;
            weatherService.resultFormat = "object";
            weatherService.showBusyCursor = true;
            weatherService.request = requestObj;
            weatherService.addEventListener(ResultEvent.RESULT , weatherService_resultHandler);
            weatherService.addEventListener(FaultEvent.FAULT, weatherService_faultHandler);
            weatherService.send();
        }

        protected function weatherService_resultHandler(event:ResultEvent):void
        {
            trace("got result");
            **//WANT TO GIVE THIS RESULT BACK TO THE CALLER. SINCE RETURN TYPE OF 
            //METHOD IS VOID I CANNOT RETURN ANYTHING FROM HERE. HOW TO MAKE THIS
            //METHOD TO RETURN DATA?**
        }

        protected function weatherService_faultHandler(event:FaultEvent):void
        {
            trace("got fault");
        }
4

1 に答える 1

3

プロジェクトのアーキテクチャに応じて、いくつかのソリューションがあります。主なアイデアは、サービスが応答を受信して​​呼び出し元で処理するときにイベントを発生させる (またはコールバックを呼び出す) ことです。weatherServiceこの例で最も簡単な方法は、メソッドでオブジェクトを返しcallService、呼び出し元に同じリスナーを追加することです (ResultEvent.RESULTおよびFaultEvent.FAULT)。このソリューションの欠点は、解析された値オブジェクトを操作するのではなく、呼び出し元で生のサーバー応答を解析する必要があることですが、すべてがプロジェクトのデータ フローに依存していることに気付きました。

UPD: コールバックの使用例:

//map for storing the {service:callback} linkage
private var callbacks:Dictionary = new Dictionary(true);
/*
callback is a function like: function(success:Boolean, data:Object):void
*/
private function callService(callback:Function):void
{
    var requestObj:Object = {};
    requestObj.q = cityName.text.toString();
    requestObj.format = FORMAT;
    requestObj.num_of_days = cNUMBER_OF_DAYS;
    requestObj.key = API_KEY;

    var weatherService:HTTPService = new HTTPService();
    weatherService.resultFormat = "object";
    weatherService.showBusyCursor = true;
    weatherService.request = requestObj;
    weatherService.addEventListener(ResultEvent.RESULT, weatherService_handler);
    weatherService.addEventListener(FaultEvent.FAULT, weatherService_handler);
    var token:AsyncToken = weatherService.send();

    var obj:Object = {callback:callback, service:weatherService};
    callbacks[token.message.messageId] = obj;
}

protected function weatherService_handler(event:Event):void
{
    var success:Boolean = event.type == ResultEvent.RESULT;
    var token:AsyncToken = success ? ResultEvent(event).token : FaultEvent(event).token;

    var obj:Object = callbacks[token.message.messageId]
    var service:HTTPService = obj.service;
    service.removeEventListener(ResultEvent.RESULT , weatherService_handler);
    service.removeEventListener(FaultEvent.FAULT, weatherService_handler);

    var data:Object = success ? ResultEvent(event).result : FaultEvent(event).fault;
    var callback:Function = obj.callback;
    delete callbacks[event.target];

    callback(success, data);
}
于 2013-01-14T14:40:20.327 に答える