Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как разрулить множественные SOAP запросы для инициализации колекшена (http://www.flasher.ru/forum/showthread.php?t=131472)

kostepanych 21.10.2009 14:30

Как разрулить множественные SOAP запросы для инициализации колекшена
 
Доброго времени суток,

Мне нужно проинициализировать ArrayCollection объектами, значения филдов которого получаются через СОАП запросы (функция getUdfValuePrj):

Код:

for (var i:int=0; i < data.length; i++)
 {
  var task:Task=new Task();
  task.laborio = getUdfValuePrj(data[i].id, LABORIOUSNESS);
 }
 tempTaskArray.addItem(task);

Вот инициализация Вэбсервиса:

Код:

private function initWebServices(wsdl:String):void
    {
  _udfWs = new WebService();
  _udfWs.wsdl = wsdl;
  _udfWs.getTaskUDFValue.addEventListener("result",
  getTaskUDFValueResult);
  _udfWs.getTaskUDFValue.addEventListener("fault", handleFault);
  _udfWs.loadWSDL();
 }

Собственно говоря вопрос, какими должны быть функции getUdfValuePrj (для СОАП запроса) и getTaskUDFValueResult (для получения requesta)? Или как это можно сделать по другому?

Пытался сам что-то соображать, получилась такая ересь:

Код:

private function getTaskUDFValueResult(event:ResultEvent):
 {
  _udfValue = event.result as String;
 }
 
private function getUdfValuePrj (taskId:String, udfCaption:String):void
 {
  _udfValue = "Loading...";
  _udfWs.getTaskUDFValue (taskId,udfCaption);
  while (_udfValue == "Loading...")
  {
  }
  return _udfValue;
 }

Но это: 1) Криво; 2) Не работает.

dimarik 21.10.2009 21:24

В разделе Flex спросите.

wvxvw 21.10.2009 21:48

1. Читать справку:
http://livedocs.adobe.com/flex/3/lan...ebService.html
2. Загрузка в AS3 асинхронная. Соответственно, подписаться на события и обработать их.
3. Если использование фреймворка не является жизненной необходимостью, то лучше использовать URLLoader вместо WebService.

kostepanych 27.10.2009 15:38

1. Справку читал.
2. А вы мой код смотрели? Вообще-то я обрабатываю событие "result". Но код получается не очень адекватный.
3. А смысл? В любом случае для каждого параметра нужно ожидать событие окончания загрузки.

wvxvw 27.10.2009 17:05

Цитата:

Сообщение от kostepanych (Сообщение 861159)
1. Справку читал.

Код AS3:

while (_udfValue == "Loading...")
  {
  }

И где вы в спавке видели такой вариант ожидания ответа от сервера?

Цитата:

Сообщение от kostepanych (Сообщение 861159)
2. А вы мой код смотрели? Вообще-то я обрабатываю событие "result". Но код получается не очень адекватный.

Ваш код смотрел... да. Ну ничего вы не обрабатываете, следуя вашей логике вообще не понятно зачем вы обработчики добавили...

Цитата:

Сообщение от kostepanych (Сообщение 861159)
3. А смысл? В любом случае для каждого параметра нужно ожидать событие окончания загрузки.

Помоему преимущества использования билт-ин класса плеера против какого-то пользовательского класса очевидны:
- этот класс не встраивается в SWF. (меньше размер файла)
- его методы и свойства реализованы на C и не требуют компиляции при загрузке SWF. (быстрее работает)

kostepanych 27.10.2009 19:13

Цитата:

Ну ничего вы не обрабатываете
А как же?

Код AS3:

private function getTaskUDFValueResult(event:ResultEvent):
 {
  _udfValue = event.result as String;
 }

Смысл моего вопроса заключается в том, как проинициализировать не бессмысленный филд, а каждый элемент task.laborio для создания списка tempTaskArray.

Я нашел примеры, где осуществляется один запрос, а в обработчике мы просто инициализируем то, что надо, например так:
Код AS3:

private function getAvailableBooksResult(event:ResultEvent):void 
{
  dgGrid.dataProvider = event.result;
}

Но что делать, когда таких запросов много? Как указать в моем случае в обработчике, что я хочу проинициализировать конкретный элемент списка tempTaskArray?

†‡Paladin‡† 27.10.2009 19:19

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

dimarik 28.10.2009 10:17

Цитата:

Сообщение от kostepanych (Сообщение 861243)
Смысл моего вопроса заключается в том, как проинициализировать не бессмысленный филд, а каждый элемент task.laborio для создания списка tempTaskArray.

Обобщаю смысл Вашего вопроса: как соотнести пришедшие данные с адресатом.
Вариантов всего два: либо адрес назначения содержится в ответе, либо клиент знает куда распихивать пришедшие данные.

kostepanych 03.11.2009 13:20

Цитата:

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


Часовой пояс GMT +4, время: 21:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.