Flex RemoteObject - обработка нескольких запросов - PullRequest
4 голосов
/ 12 июля 2009

У меня есть пара методов удаленных объектов, на которые я хочу реагировать по-разному в зависимости от контекста, но я бы не стал устанавливать кучу разных псевдонимов RemoteObject. Любой совет по этому поводу? Немного предыстории:

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

<mx:RemoteObject id="rpt" destination="AMFServer">
  <mx:method name="getSalesStats" fault="getSalesStatsFault(event)" 
    result = "getSalesStatsSuccess(event)" />
</mx:RemoteObject>

Метод getSalesStats принимает идентификатор сотрудника и тип продаж в качестве аргументов. Вы бы назвали это как:

rpt.getSalesStats(120, "peanuts");

public function getSalesStatsSuccess(e:ResultEvent):void {
   salesdata:ArrayCollection = e.result.rows as ArrayCollection; 
   salesGraph.dataProvider = salesdata; 
   salesGraphPanel.title = "Peanut Sales, 1990";
}

Я хочу иметь возможность вызывать этот метод в разных контекстах, иногда отправляя результат на диаграмму, а иногда на сетку данных; Я хочу иметь возможность изменять заголовок и тип диаграммы в зависимости от того, что хочет пользователь. Часть того, чего я хочу, может быть достигнута путем оценки данных, возвращаемых с сервера; объект содержит имя отчета, поэтому я могу оценить это значение. Но некоторые вещи нужно менять, основываясь не только на том, что я получаю от сервера. Если бы это был синхронный вызов, это было бы легко; Я бы сделал что-то вроде:

function buttonOneClick():void {
   myData1:ArrayCollection = getSalesStats(120, "peanuts");
   myChart.dataProvider = myData1;
}

function buttonTwoClick():void {
   myData2:ArrayCollection = getSalesStats(120, "cashews");
   myDataGrid.dataProvider = myData2; 
}

Я бы хотел передать что-то через удаленный метод отвечающей функции, например:

rpt.getSalesStats(120, "peanuts", "clicked button one");

но это, конечно, выдает ошибку, потому что серверу не нужен последний аргумент. Какие-нибудь мысли? Я уточню, если это сбивает с толку ..

Ответы [ 6 ]

2 голосов
/ 09 ноября 2009

В Flex 4 и 3.4 используйте класс CallResponder:

<mx:RemoteObject id="rpt" destination="AMFServer"/>
<s:CallResponder id="toChartResponder" fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToChartSuccess(event)" />
<s:CallResponder id="toDataGridResponder"fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToDataGridSuccess(event)"/>

Чтобы сделать вызов, присвойте возвращенный AsyncToken из вызова метода свойству токена респондента:

toDataGridResponder.token = rpt.getSalesStats();

Это отделяет определение ответа от вызова метода, и вы можете затем обернуть его в любую логику, которая вам нужна.

2 голосов
/ 02 сентября 2009

Вот отличный пример использования AsyncToken с вызовами метода RemoteObject для выполнения именно того, что вам нужно.

При использовании AsyncToken следует иметь в виду, что это динамический объект, и вы можете добавить к нему любое свойство, которое захотите. Событие в вашем методе респондента будет содержать ссылку на AsyncToken, и вы сможете получить доступ к своим динамическим свойствам, чтобы легко определить контекст ответа.

0 голосов
/ 29 марта 2011

var rpcCall: AsyncToken;

    rpcCall = remoteService.getSessionId();
    rpcCall.addResponder(new Responder(handler_getSessionIdSuccess, handler_getSessionIdFault) );

    rpcCall = remoteService.getMyData();
    rpcCall.addResponder(new Responder(handler_getMyDataSuccess, handlerfault));

экземпляр "remoteService" удаленного объекта Надеюсь, это будет иметь смысл.

0 голосов
/ 03 сентября 2009

Я думаю, что есть только два способа сделать это:

  • Иметь отдельный удаленный объект для каждого контекста вызова. Влияние на производительность пренебрежимо для ИМО.
  • Установите параллелизм для удаленного объекта равным одиночному (или первому, не уверенному относительно имени, но не множественному или последнему) и установите некоторый тип флага, который вы можете использовать, чтобы определить, какой последний метод был вызван. Это, конечно, ограничит количество обращений к серверу по одному на этот удаленный объект. вызовы сразу прервутся, если предыдущий вызов еще не дал результата.

Это единственный способ увидеть это, если у вас нет доступа к серверу. Если бы я был в вашей ситуации, я даже создаю удаленный объект каждый раз, когда делаю удаленный вызов. Я не думаю, что это влияет на производительность (пожалуйста, поправьте меня, если я ошибаюсь). Удачи!

0 голосов
/ 02 сентября 2009

Flex поддерживает шаблон проектирования Asynchronous Completion Token для обработки нескольких запросов к одному и тому же сервису. См. Документацию BlazeDS .

.
0 голосов
/ 12 июля 2009

Вы можете иметь несколько методов для удаленного объекта.

<mx:RemoteObject id="rpt" destination="AMFServer">
    <mx:method name="getSalesStatsToChart" fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToChartSuccess(event)" />
    <mx:method name="getSalesStatsToDataGrid" fault="getSalesStatsFault(event)" 
        result = "getSalesStatsToDataGridSuccess(event)" />
</mx:RemoteObject>

Есть ли причина, по которой вы не можете использовать что-то подобное?

...