PDA

Просмотр полной версии : Как разрулить множественные SOAP запросы для инициализации колекшена


kostepanych
21.10.2009, 14:30
Доброго времени суток,

Мне нужно проинициализировать 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/langref/mx/rpc/soap/WebService.html
2. Загрузка в AS3 асинхронная. Соответственно, подписаться на события и обработать их.
3. Если использование фреймворка не является жизненной необходимостью, то лучше использовать URLLoader вместо WebService.

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

wvxvw
27.10.2009, 17:05
1. Справку читал.
while (_udfValue == "Loading...")
{
}
И где вы в спавке видели такой вариант ожидания ответа от сервера?

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

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

kostepanych
27.10.2009, 19:13
Ну ничего вы не обрабатываете
А как же?

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

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

Я нашел примеры, где осуществляется один запрос, а в обработчике мы просто инициализируем то, что надо, например так:
private function getAvailableBooksResult(event:ResultEvent):void
{
dgGrid.dataProvider = event.result;
}

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

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

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

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

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