Что такое класс <s: CallResponder> во Flex 4? - PullRequest
2 голосов
/ 20 января 2012

Я изучаю сетевую часть Flex 4.5 прямо сейчас, и курс, который я рассматриваю, рекомендует использовать класс <s:CallResponder> всякий раз, когда я звоню на сервер, либо с компонентом <s:HTTPService>, либо с моим заказной сервисный вызов к базе данных.

Как в самом курсе, так и в документации Adobe я не могу найти действительно хорошего описания того, почему я должен использовать этот подход. Может ли кто-нибудь описать, почему это хорошая идея, и, возможно, привести случай, когда она настоятельно рекомендуется?

См. Этот пример ниже для простого случая, когда я его использую. Я объявляю экземпляр класса внутри тега <fx:Declarations> и использую его внутри метода fetchData():

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               skinClass="skins.CustomAppSkin">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;

            [Bindable]
            private var booksCollection:ArrayCollection;

            private function formatPrice(data:Object, columns:GridColumn):String {
                return priceFormatter.format(data.price);
            }

            protected function fetchData(event:MouseEvent):void {
                booksResponder.token = books.send();
            }

            protected function processXML(event:ResultEvent):void {
                this.booksCollection = event.result.catalog.book;
            }

            protected function loadHandler(event:FaultEvent):void {
                Alert.show(event.fault.faultString, event.fault.faultCode);
            }
        ]]>
    </fx:Script>

    <fx:Declarations>
        <s:HTTPService id="books" url="data/books.xml"/>
        <s:CurrencyFormatter id="priceFormatter" currencySymbol="$" fractionalDigits="2" trailingZeros="true" useCurrencySymbol="true"/>
        <s:CallResponder id="booksResponder" result="processXML(event)" fault="loadHandler(event)"/>
    </fx:Declarations>

    <s:Panel id="panel" title="Products" horizontalCenter="0">
        <s:DataGrid dataProvider="{booksCollection}" height="400">
            <s:columns>
                <s:ArrayList>
                    <s:GridColumn headerText="Title" width="250" dataField="title"/>
                    <s:GridColumn headerText="Author" dataField="author"/>
                    <s:GridColumn headerText="Genre" width="100" dataField="genre"/>
                    <s:GridColumn headerText="Publish Date" width="100" dataField="publish_date"/>
                    <s:GridColumn headerText="Description" width="400" dataField="description"/>
                    <s:GridColumn headerText="Price (USD)" width="100" dataField="price" labelFunction="formatPrice"/>
                </s:ArrayList>
            </s:columns>
        </s:DataGrid>

        <s:controlBarContent>
            <s:Button id="getData" label="Get Data" click="fetchData(event)"/>
        </s:controlBarContent>
    </s:Panel>
</s:Application>

Ответы [ 2 ]

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

Может быть, поможет какой-нибудь "исторический" фон.Имя «Ответчик» относится к тому, как класс NetConnection, который является встроенным API проигрывателя Flash, обрабатывает связь.Когда вы делаете вызов NetConnection (который обычно используется либо для простого HTTP-соединения, где сообщения кодируются в AMF, либо для загрузки / потоковой передачи видео, которое обычно является RTMP-вариантом соединения).Респондент используется с NetConnection для связи с использованием кодировки AMF по HTTP.

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

Приведенная выше схема отличается от других сетевых API, существующих в Flash Player.Трудно придумать причину, но так было с AS2.В AS2, однако, был объект LoadVars, который также использовал обратные вызовы для сообщений об ошибках и успехах.Класс XML ведет себя аналогичным образом - вы также создадите две функции обратного вызова и назначите их обработчикам XML по умолчанию.Не исключено, что респондент является зачатком дизайна, предшествующего AS3.

Когда Adobe (по причинам, известным только им) решила наложить кучу слоев косвенности поверх NetConnection (известного в Flexкак RemoteObject) они сохранили старый выбор дизайна.Они также заставили более свежий API вести себя более архаичным образом.Так, например, HTTPService, который в основном является скрытым URLLoader, ведет себя так же, как RemoteObject.Возможно, это несколько помогло в шаблонах MXML, но как только вы поймете, что язык MXML чрезвычайно ограничен, относительные достоинства функций, специально разработанных для макета MXML, скорее станут доской, состоящей из множества сомнительных дизайнерских решений.

Amy: функция afaik DCD (генерация кода для служб, используемых в Flash Builder) не была выпущена для Apache - она ​​является частью Flash Builder.Так что вряд ли это изменится, если только Adobe не изменит это самостоятельно.

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

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

...